Текст, который вы цитируете, уже объясняет, почему time
является ключевым словом:
Использование time как зарезервированного слова позволяет определять время для встроенных модулей оболочки, функций оболочки и конвейеров. Внешняя команда time не может легко определить время.
Если бы time
был только встроенным модулем, он не смог бы правильно измерить время, затраченное конвейером, например:
$ time sleep 2 | sleep 4
real 0m4.002s
user 0m0.000s
sys 0m0.002s
Здесь time возвращает 4 секунды, что является временем, затраченным всем конвейером. Если бы она была реализована как встроенная, грамматика shell позволила бы ей вернуть только 2 секунды, потому что команда, встроенная или нет, видит только свои параметры, в данном конкретном случае sleep 2
.
Другие ключевые слова, которые не могут быть реализованы встроенными модулями, используются для структурированных конструкций, таких как for, while, until, case, do, done, select, if, then, else, function
. Как и time
, они должны уметь обрабатывать интерпретируемые строки, не ограничиваясь простой границей команд.
Именно по этой же причине, т.е. возможности доступа ко всему вводу оболочки, подлежащему разбору, а не только к команде и ее параметрам, эти ключевые слова реализованы как есть. Например, параметры команд [
подвержены расширению и обработке оболочкой, поэтому вы не можете надежно использовать *
в тесте, а >
будет воспринято как перенаправление с неожиданными результатами.
С другой стороны, [[
изменяет поведение оболочки, так что вы можете использовать любой синтаксис, который она принимает, не беспокоясь об этом.
Вот несколько примеров, демонстрирующих разницу в поведении:
$ if [ * = "*" ]; then echo ok; fi
bash: [: too many arguments
$ if [[ * = "*" ]]; then echo ok; fi
ok
$ if [ 1 > 2 ]; then echo unexpected ; else echo expected; fi unexpected $ if [ 1 -gt 2 ]; then echo unexpected ; else echo expected; fi expected $ if [[ 1 > 2 ]]; then echo unexpected ; else echo expected; fi expected
Обратите внимание, что if [ 1 > 2 ]
не только возвращает неожиданный результат, но и создает (или перезаписывает!) в текущем каталоге файл с именем 2
.
Вы всегда можете попробовать использовать ps
, чтобы определить, какие процессы заканчиваются, например:
ps -ely | grep -i $PROCESSNAME
Предполагая, какими будут имена виджетов:
ps -ely | grep -i gnome
С большой вероятностью можно перечислить их все.
Я только что scp
редактировал старый добрый xkill на этой машине, и он работал Как колдовство.