Оболочка C: различные действия в зависимости от типа файла

Это потому, что эти программы являются частью чашек , разработанных Apple.

То, что программа ( номер люкс) является открытым исходным кодом, не означает, что разработчик или компания (частично), оплачивающая разработку, не могут претендовать на авторские права на свои усилия.

-121--154438-

Функция current-message возвращает сообщение, которое в данный момент отображается в области эха , если имеется. Вставить его можно с помощью (вставить (текущее сообщение)) . Однако все, что заставляет что-либо другое занимать эхо-область, приведет к тому, что current-message возвратит nil .

Сообщения от Emacs архивируются в буфере * Messages * . Было бы полезнее захватить оттуда последнюю строчку. Это не совсем надежно, так как возможно иметь многострочное сообщение, но это редко: функция message предназначена для коротких сообщений, которые помещаются в одну строку.

Следующая функция вставляет последнее сообщение (точнее, последнюю строку из буфера * Messages * . При использовании аргумента префикса он возвращает более старые сообщения: 1 для последнего сообщения, 2 для следующего сообщения и т.д. Аргумент 0 вставляет (текущее сообщение) , если имеется.

(defun last-message (&optional num)
  (or num (setq num 1))
  (if (= num 0)
      (current-message)
    (save-excursion
      (set-buffer "*Messages*")
      (save-excursion
    (forward-line (- 1 num))
    (backward-char)
    (let ((end (point)))
      (forward-line 0)
      (buffer-substring-no-properties (point) end))))))
(defun insert-last-message (&optional num)
  (interactive "*p")
  (insert (last-message num)))

Свяжите его с ключом обычным способом. Например, если вы хотите, чтобы команда всегда была доступна на C-c m :

(global-set-key "\C-cm" 'insert-last-message)

Возможно, проще, чем вызвать две пользовательские команды для вставки имени файла, см. Emacs wiki .

Чтобы вставить выходные данные вычисления фрагмента Lisp с помощью C-x C-e , передайте аргумент префикса C-u C-x C-e .

-121--62600-

«Ошибка ввода/вывода» указывает на проблему низкого уровня, которая, вероятно, имеет мало общего с файловой системой.

Он должен появиться в dmesg , и выходные данные smartctl -x/dev/sdX также могут дать подсказки.

Можно также попробовать strace -f -s200 ntfs-3g [args] 2 > & 1 | less , чтобы увидеть, какой syscall попадет в ошибку ввода/вывода.

Основной причиной, вероятно, является одна из следующих причин:

  • неисправный кабель SATA в блоке Debian;
  • проблема с поставкой питания или кабель питания SATA в блоке Debian;
  • неисправный диск;
  • ошибка в ntfs-3g, заставляющая его пытаться получить доступ за пределы устройства (возможно, в сочетании с некоторой странностью в конкретном томе NTFS, который у вас есть, что как-то не влияет на другие реализации);
  • дефектная оперативная память в Debian box.

Если вы опубликуете выходные данные вышеперечисленных команд, можно будет сказать, какие.

1
07.11.2014, 01:29
2 ответа
  1. Вы взглянули на ionice?
  2. Возможно, вы захотите запустить updatedb/find с posix fadvise, чтобы сообщить ОС, что вы не хотите, чтобы эти программы испортили ваш кэш страниц. Таким образом, ваш кэшированный диск i/o остается в памяти.
  3. Можно также переработать задания cron, чтобы эти фоновые процессы были перенесены во времена, когда вычисления не выполняются. Кроме того, вы можете изменить задания cron, чтобы сначала узнать, занят ли ваш диск перед запуском (если iostat -x, говорит, что диск занят, то спите в течение часа и повторите попытку)
  4. Ввод-вывод на ноутбуках может отсосать, если ваш ноутбук делает 5400RPM. Вы можете попробовать добавить несколько планок, чтобы использовать кэш страниц.
  5. Медленная работа Firefox на самом деле представляет собой интересную проблему. На моей предыдущей работе у нас была проблема. Если я правильно помню, Linux агрессивно предпочитает хранить ваши страницы ввода-вывода в кэше памяти. Она будет даже доходить до замены памяти программы (т.е. firefox). Так что когда вы идете запуск firefox, Linux придется поменять местами какое-то другое приложение, чтобы создать пространство, поменяться местами в firefox и выполнить ваш запрос...
-121--166996-

Попробуйте использовать опцию --stdout :

$ SELECTION=$( dialog --stdout \
    --backtitle "Make a choice" \
    --menu "Take a pick" \
    10 40 3 \
    choice1 "First choice" \
    choice2 "Second choice" \
)
-121--100661-

Используйте обратные кнопки для вычисления результата команды внутри, это то же самое, что и для других оболочек. Итак, вместо

"echo ${1} | cut -d'.' -f2"

, которая является последовательностью, которая наверняка не равна последовательности «zip», используйте

`echo ${1} | cut -d'.' -f2`

, которая вычисляет команду внутри и возвращает результат.

0
28.01.2020, 01:51

Для анализа имени файла используйте переключатель .

switch ($1)
case *.zip:
  echo "$1 is a zip file"
  breaksw
default:
  echo "${1}: not supported"
endsw

Для анализа типа файла разберите вывод ls: первый символ - тип файла.

switch ("`ls -logd "$1"`")
case d*:
  echo "$1 is a directory"
  breaksw
# ...
endsw

Скорее всего, вы ищете команду file , которая анализирует содержимое файла, чтобы определить, какой формат данных в нем содержится (и сообщает тип файла для нерегулярных файлов).

file -- "$1"
0
28.01.2020, 01:51

Теги

Похожие вопросы