Я нашел что-то немного лучше, чем timeout
: timelimit
.
Это имеет несколько преимуществ; каждый - тот пользователь, может вручную прервать выполнение путем нажатия "Ctrl+C".
timelimit
программа доступна в репозитории Debian.
Точка означает «этот каталог» точка означает предыдущий каталог.
Когда файл или каталог начинается с точки, означающей «скрыть»
«Скрыть» для ls или других команд, а не для FS. Поэтому при запуске ls/home/foo файлы или каталог, начинающиеся с точки, не отображаются.
При запуске «rm -r/home/foo/*» все файлы будут удалены. Не файлы или каталоги, начинающиеся с точки.
Теперь, в случае каталога, это нужно выполнить разрешение, по крайней мере для владельца. Не имеет значения, начинается ли с точки или нет. X разрешение означает «descend» o «execute».
Попробуйте удалить x
Вариант nullglob
(который BTW является zsh
изобретением, только добавленным годами позже к bash
( 2,0
)) не был бы идеальным в ряде случаев. И ls
является хорошим примером:
ls *.txt
или его более правильный эквивалент:
ls -- *.txt
С помощью nullglob
на будет выполняться ls
без аргумента, который рассматривается как ls --.
(перечислить текущий каталог), если файлы не совпадают, что, вероятно, хуже, чем вызов ls
с литералом * .txt
в качестве аргумента.
У вас возникнут аналогичные проблемы с большинством текстовых утилит:
grep foo *.txt
Ищите foo
на stdin, если нет файла txt
.
Более разумное значение по умолчанию, и одно из csh, tcsh, zsh или fish 2.3 + (и ранних оболочек Unix) состоит в том, чтобы вообще отменить команду, если глобус не совпадает.
bash
(начиная с версии 3) имеет для этого опцию failglob
(интересна этому обсуждению, так как в отличие от ash
, AT & T ksh
или zsh
, bash
не поддерживает локальные области для опций (хотя это и должно измениться в 4,4), эта опция включается глобально
Обратите внимание, что csh и tcsh немного отличаются от zsh
, fish
или bash -O failglob
в таких случаях, как
ls -- *.txt *.html
Где необходимо, чтобы все глобусы не совпадали для отмены команды. Например, если есть один файл txt и нет файла html, то это будет:
ls -- file.txt
Вы можете получить это поведение с zsh
с setopt csshnullglob
, хотя более разумным способом сделать это в zsh
было бы использовать глобус типа:
ls -- *.(txt|html)
В zsh
и ksh93
можно также применить nullglob на основе для каждого глобуса, что намного безопаснее, чем изменение глобальной настройки:
files=(*.txt(N)) # zsh
files=(~(N)*.txt) # ksh93
создаст пустой массив, если нет файла txt
вместо того, чтобы выполнить команду с ошибкой (или сделать его массивом с одним * .txt
литеральным аргументом с другими оболочками).
Версии fish
до 2,3 работали бы как bash -O nullglob
, но давали бы предупреждение при интерактивном режиме, когда глобус не совпадает. С 2.3,он работает как zsh
, за исключением глобусов, используемых в для
, set
или count
.
Теперь, как показывает история, поведение было фактически нарушено оболочкой Борна. В предыдущих версиях Unix глоббинг выполнялся через помощник /etc/glob
, и этот помощник вел себя как csh
: он не выполнил бы команду, если бы ни один из глобусов не соответствовал какому-либо файлу и не удалял глобусы без соответствия в противном случае.
Ситуация, в которой мы находимся сегодня, объясняется плохим решением, принятым в оболочке Борна.
Обратите внимание, что оболочка Bourne (и оболочка C) поставляется с другой новой функцией Unix: средой. Это означало переменное расширение (его предшественник имел только $1
, $2
... позиционные параметры). Оболочка Борна также ввела подстановку команд.
Другим плохим проектным решением оболочки Борна было выполнить глоббинг (и разделение) при расширении переменных и подстановке команд (возможно, для обратной совместимости с оболочкой Томпсона, где echo $1
будет по-прежнему вызывать /etc/glob
, если $1
содержит подстановочные знаки (это было больше похоже на предпроцессорное макро-расширение, так как в расширенном значении снова разбиралось как оболочечный код)).
Неуспевающие глобусы будут означать, например, что:
pattern='a.*b'
grep $pattern file
приведет к сбою команды (если в текущем каталоге нет файлов a.whateverb
). csh
(который также выполняет глоббинг при переменном расширении) действительно проваливает команду в этом случае (и я бы сказал, что это лучше, чем оставить спящую ошибку там, даже если это не так хорошо, как не делать глоббинг вообще, как в zsh
).
Из руководства ( man bash
):
$ (
команда)
или'
команда'
Bash выполняет расширение, выполнив команду и заменив команду стандартным выводом команды, удалив любые завершающие новые строки. Внедренные новые строки не удаляются, но могут быть удалены во время разделения слов. Замена команды
$ (cat
файл)
может быть заменена эквивалентной, но более быстрой$ (<
файл)
.При использовании старой формы подстановки обратная косая черта сохраняет свое буквальное значение, за исключением случаев, когда за ней следуют
$
,'
или\
. Первая обратная кавычка, которой не предшествует обратная косая черта, завершает подстановку команды. При использовании формы$ (
команда)
все символы между скобками составляют команду; ни к одному из них не относятся специально.
Стандарт POSIX определяет форму замены команды $ ()
. $()
позволяет использовать вложенные команды и лучше выглядит (удобочитаемость).Он должен быть доступен на всех оболочках Борна .
Дополнительную информацию можно найти в документе IEEE Std 1003.1, Язык команд оболочки, Раздел 2.6.3, Подстановка команд .
По крайней мере, один Unix, AIX, задокументировал, что обратные кнопки устарели . Из этой ссылки:
Хотя синтаксис обратной кавычки принят ksh, он считается устаревшим согласно X/Open Portability Guide Issue 4 и стандартам POSIX. Эти стандарты рекомендуют портативным приложениям использовать синтаксис $ (команда).
Однако /bin/sh
не обязательно должен соответствовать POSIX. Так что иногда в реальном мире все еще есть случай для обратной связи, как указывает @ Jeight.
Это много личных предпочтений. Использование BackTick для обозначения команды будет более POSIX, совместимым с более старыми системами. $ () Более современным и легче читать для некоторых людей. Я бы лично никогда не использовал file_list_1 = $ (echo list.txt »)
. Это кажется уродливым и не имеет дополнительного использования.