Объясните этот бит кода

Может кто-нибудь объяснить, что означает этот бит кода?

Я считаю, что вторая строка - "если статус выхода равен нулю", тогда эхо "действительная команда", но я не понимаю первую строку

[email protected] &>/dev/null
if [[ $? = 0 ]]
then
   echo "Valid command"
fi

Ответ 1

Я хотел бы добавить, что это излишне подробный и может быть сокращен до

if "[email protected]" &>/dev/null
then
    echo "Valid command"
fi

или даже короче

"[email protected]" &>/dev/null && echo "Valid command"

Ответ 2

Первая строка запускает команду, образованную простым использованием всех аргументов в script и перенаправлением вывода в /dev/null, который по существу отбрасывает его.

Встроенная переменная [email protected] расширяется до всех позиционных параметров, причем каждый параметр представляет собой строку с кавычками, то есть параметры переданы без изменений, без интерпретации или расширения. Чтобы получить этот эффект, я считаю, что вам нужно указать использование переменной, т.е. "[email protected]".

Оператор &> перенаправляет как stdout, так и stderr.

Ответ 3

В соответствии с manual, [email protected] расширяется до позиционных параметров, начиная с одного. Если вы назовете это script как scripty.sh ls /, он выполнит ls /, перенаправляя весь вывод в ведро бит. Это должно вернуть успех (надеюсь!), И, таким образом, script напечатает Valid command. Если вы вызываете его scripty.sh ls /some/nonexistent/directory, тогда команда ls должна завершиться неудачно, а script ничего не выведет.

На самом деле, я думаю, что script можно улучшить, добавив двойные кавычки вокруг [email protected], чтобы аргументы с пробелами в них не прерывали интерпретатор.

С [email protected] команда ls "/Library/Application Support" расширена до трех слов. С "[email protected]" он расширился до двух, и команда запускается так же, как и без script обертывания.