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

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

date 2&>$0 

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

  • Удалите переднюю косую черту с помощью sed
  • Как я могу обернуть расширение переменной в кавычки?
  • эвристически найти, как различный набор файлов
  • Как получить имя программы, которая вызвала ошибку ввода-вывода, перенаправленную в LOG в команде nohup?
  • Итеративный поток управления в подчиненном скрипте
  • ksh, выполнить действие при достижении максимального значения цикла
  • Ищете способ превратить несколько команд с одним и тем же параметром в один лайнер
  • netcat в сценарии оболочки, дающий недействительное соединение
  • 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 , но это совершенно порочно.

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