Когда следует использовать $ () при определении переменных

Я нашел что-то немного лучше, чем timeout: timelimit.

Это имеет несколько преимуществ; каждый - тот пользователь, может вручную прервать выполнение путем нажатия "Ctrl+C".

timelimit программа доступна в репозитории Debian.

5
14.04.2019, 11:23
2 ответа

Точка означает «этот каталог» точка означает предыдущий каталог. Когда файл или каталог начинается с точки, означающей «скрыть» «Скрыть» для ls или других команд, а не для FS. Поэтому при запуске ls/home/foo файлы или каталог, начинающиеся с точки, не отображаются. При запуске «rm -r/home/foo/*» все файлы будут удалены. Не файлы или каталоги, начинающиеся с точки.
Теперь, в случае каталога, это нужно выполнить разрешение, по крайней мере для владельца. Не имеет значения, начинается ли с точки или нет. X разрешение означает «descend» o «execute». Попробуйте удалить x

-121--247078-

Вариант 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 ).

-121--7051-

Из руководства ( 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.

9
27.01.2020, 20:35

Это много личных предпочтений. Использование BackTick для обозначения команды будет более POSIX, совместимым с более старыми системами. $ () Более современным и легче читать для некоторых людей. Я бы лично никогда не использовал file_list_1 = $ (echo list.txt ») . Это кажется уродливым и не имеет дополнительного использования.

1
27.01.2020, 20:35

Теги

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