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

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

Я смотрю на шелл-код коллеги и вижу следующее:

date 2&>$0

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

решение1

Если предположить, что код, который вы разместили, правильный, то то, что он делает, очень странно. Он:

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

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

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


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

решение2

Краткое содержание

В разделе 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. Весь вывод команды date, как stdout, так и stderr, перенаправляется в файл $0. $0— имя текущего скрипта.

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

  3. После перезаписи файла скрипта он перестает быть допустимым скриптом и bashвыдает сообщение о неправильно сформированных командах.

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

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

Связанный контент