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

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

date 2&>$0 

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

  • Расширение переменных в zsh
  • wc -l файл переменной
  • Как сделать цикл for в командной строке?
  • эвристически найти, как различный набор файлов
  • Почему квадратные скобки препятствуют расширению оболочки?
  • Сделать цвет текста терминала другим, когда в сеансе ssh
  • Как установить псевдоним во всех оболочках tty?
  • Начать sh в указанной директории из inittab
  • 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 , но это совершенно порочно.

    Interesting Posts

    Почему не удается root на одной машине изменить nfs смонтированный контент с другого компьютера?

    Несоответствие между выводами `fsck` и` df`

    `grep -l .. | xargs vim` генерирует предупреждение, почему?

    Ошибка малины Pi RT.

    Создать псевдоним для изменения содержимого каталога и списка

    Как apt-get имеет дело с несколькими источниками?

    Работа с поиском в manpage

    Удалить тег и содержимое на основе дочернего тега и добавить новый контент – Shellscript xml

    В чем разница между IP-адресом машины и локальным хостом

    Как ядро ​​Linux знает, что конфликты произошли в домене конфликтов Ethernet?

    Как скомпилировать исходный код в ядре?

    Двойная загрузка Ubuntu не может получить доступ к приводу Windows, на котором он был установлен с wubi

    Получение даты от клиента ssh

    Могу ли я использовать `rm` только при использовании globbing? (либо в bash, либо в zsh, либо в обоих)

    Как передать команды процессу, работающему в фоновом режиме?

    Linux и Unix - лучшая ОС в мире.