Что делает `date 2 &> $ 0` do?

Я смотрю на код оболочки сотрудников, и я увидел это:

date 2&>$0 

Я знаю, что делает дата, но что делает 2 &> $ 0? Он на какое-то время, поэтому я не могу спросить его, в чем состоит эта часть.

2 Solutions collect form web for “Что делает `date 2 &> $ 0` do?”

Резюме

В bash , если эта команда находится в скрипте, файл сценария будет перезаписан с сообщением об ошибке.

пример

Рассмотрим сценарий:

 $ cat test.sh date 2&>$0 

Теперь запустите скрипт:

 $ bash test.sh test.sh: line 2: unexpected EOF while looking for matching ``' test.sh: line 3: syntax error: unexpected end of file 

Соблюдайте новое содержание скрипта:

 $ cat test.sh date: invalid date `2' 

объяснение

Команда, date 2&>$0 , интерпретируется следующим образом:

  1. Команда date запускается с аргументом 2

  2. Все выходные данные, как stdout, так и stderr, из команды date перенаправляются в файл $0 . $0 – это имя текущего скрипта.

    Символ > указывает перенаправление, по умолчанию, stdout. В качестве расширения bash символ &> является переназначением ярлыка как для stdout, так и для stderr. Следовательно, и stdout, и stderr перенаправляются в файл $0 .

  3. Как только файл сценария будет перезаписан, он больше не является допустимым скриптом, и bash будет жаловаться на неверные команды.

Разница между bash и оболочками POSIX

С простой оболочкой POSIX, такой как dash , ярлык &> не поддерживается. Следовательно, команда date 2&>$0 будет перенаправлять только stdout в файл $0 . В этом случае это означает, что файл сценария перезаписан пустым файлом, в то время как сообщение об ошибке date появится на терминале.

Предполагая, что код, который вы опубликовали, является правильным, то, что он делает, очень странно. Это:

  • Запускает date 2 , которая не является действительным вызовом date и которая выдает сообщение об ошибке, затем
  • Перенаправляет как стандартный вывод, так и стандартную ошибку с помощью &> ,
  • В файл, содержащий исполняемый скрипт ( $0 ), стирает существующее содержимое.

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

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


Строго говоря, можно дать другое значение в $0 и, таким образом, выполнить этот код неразрушительно, вызывая Bash с опцией -c : bash -c "$(<test.bash)" output-file помещает сообщение об ошибке в output-file , но это совершенно порочно.

  • Защищенные переменные среды?
  • Возможно ли изменить сообщение об ошибке, вызванное расширением параметра, используя формат «$ {pattern:? Word}»?
  • Использование `case` для обработки аргументов скрипта
  • Не удается записать cd в каталог, нет видимых проблем
  • Что делают bash-builtins 'set' и 'export'?
  • Как использовать `which` в команде aliased?
  • Почему расширение файла glob не подавляется
  • Почему этот скрипт не работал?
  • Замените iwgetid на iw
  • Есть ли веская причина для запуска sudo su?
  • Изменение оболочки по умолчанию на Python
  • запускать команды оболочки через модуль os и модуль подпроцесса, один работает, а другой не работает
  • Linux и Unix - лучшая ОС в мире.