
Я смотрю на шелл-код коллеги и вижу следующее:
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
интерпретируется следующим образом:
Команда
date
выполняется с аргументом2
Весь вывод команды date, как stdout, так и stderr, перенаправляется в файл
$0
.$0
— имя текущего скрипта.Символ
>
указывает на перенаправление, по умолчанию, stdout. Какbash
расширение, символ&>
является ярлыком, указывающим на перенаправлениеобаstdout и stderr. Следовательно, и stdout, и stderr перенаправляются в файл$0
.После перезаписи файла скрипта он перестает быть допустимым скриптом и
bash
выдает сообщение о неправильно сформированных командах.
Разница между bash
оболочками POSIX и
С простой оболочкой POSIX, такой как dash
, ярлык &>
не поддерживается. Поэтому команда date 2&>$0
перенаправиттолькоstdout в файл $0
. В данном случае это означает, что файл скрипта перезаписывается пустым файлом, а date
на терминале появляется сообщение об ошибке.