Какой эффект эта строка имеет в сценарии оболочки? - PullRequest
1 голос
/ 18 марта 2012

Я видел эту строку во многих сценариях оболочки, но я не понимаю, какой эффект это имеет.Может кто-нибудь объяснить, пожалуйста?

tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$

Ответы [ 5 ]

5 голосов
/ 18 марта 2012

Создает временный файл и помещает путь к нему в переменную $ tempfile.

`tempfile 2>/dev/null`

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

Для команды this || that, that запускается только в случае сбоя this, т.е. возвращает ненулевое значение.

$$ - это переменная в bash, которая расширяется до идентификатора процесса оболочки.(Сравните результаты ps и echo $$.) Таким образом, tempfile=/tmp/test$$ расширится до чего-то вроде tempfile=/tmp/test2278.

Предположительно, позже в сценарии что-то записывается в $ tempfile.

3 голосов
/ 18 марта 2012

В оболочке есть отдельное пространство имен для команд и переменных (что делает его Lisp-2, LOL), которое используется в вашей строке скрипта.tempfile - это команда, которая запускается для вычисления значения переменной tempfile, которая никак не связана с ней.tempfile создает путь, подходящий для использования в качестве имени временного файла.2> /dev/null перенаправляет любое сообщение об ошибке из tempfile в /dev/null (2 - стандартный дескриптор файла ошибок).Логика command1 || command2 означает «выполнить команду 2, если команда 1 не выполнена».Если мы не можем получить временное имя из tempfile, то мы используем /tmp/test$$, где $$ - это специальный встроенный параметр оболочки, который расширяется до собственного идентификатора процесса оболочки.

2 голосов
/ 18 марта 2012

tempfile создает временный файл с именем файла, похожим на /tmp/tmp.XXXXXX

2> / dev / null перенаправляет вывод команды на устройство / dev / null, которое просто выбрасывает его. Это перенаправление просто игнорирует любые ошибки при создании временного файла.

|| объединяет две команды Если первый сбой, второй выполняется. Если первая удалась, больше ничего не происходит.

$$ - это pid текущей оболочки, что означает, что в случае сбоя команды tempfile переменная tempfile будет по-прежнему содержать строку в форме / tmp / test6052, если pid процесса равен 6052.

0 голосов
/ 18 марта 2012

Вы смотрели на man tempfile ?

Эта строка пытается использовать tempfile(1) для генерации временного имени файла, сохраняя его в $tempfile.Если это не удается («||», «или» часть), оно возвращается к явному имени файла /tmp/test$$, где $$ равно PID исполняемого сценария .

0 голосов
/ 18 марта 2012

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

The || означает «если LHS (левая сторона) потерпела неудачу, тогда выполните RHS (правая сторона)».

Итак, если у команды tempfile возникла проблема, будет использоваться RHS,назначение более простого временного имени файла для tempfile (переменная).

В целом, оно эквивалентно:

if tempfile=`tempfile 2>/dev/null`
then : OK
else tempfile=/tmp/test$$
fi

Только в одной строке, а не в четырех.

Я уверен, что идея состоит в том, чтобы получить что-то в $tempfile независимо от того, существует ли на компьютере команда tempfile.

...