Я могу использовать 'тип', чтобы проверить, является ли произвольное имя допустимым названием команды?

Имейте Вас попробованный любое из следующего:

uname -a

или

cat /proc/version
1
07.01.2014, 17:05
2 ответа

ОПИСАНИЕ

Утилита типа должна указать, как каждый аргумент был бы интерпретирован, если используется в качестве названия команды.

(…)

Следующие значения выхода должны быть возвращены:

0 Успешное завершение.
>0 Ошибка произошла.

“Успешное завершение” означает, что аргумент может быть интерпретирован как название команды, в этом случае управлять, чтобы поиск успешно выполнился бы. Ошибка означает, что аргумент не мог быть интерпретирован как название команды, в этом случае управлять, чтобы поиск перестал работать.

Статус возврата type полностью портативный POSIX способ проверить, допустимо ли название команды, или настолько близко, как это может добраться. Существуют более старые системы где type возвраты 0 на недопустимых командах (таких как OSF1 V3, но я думаю OSF1 V4, совместимы POSIX, по крайней мере, когда среда оболочки находится в режиме POSIX (BIN_SH=xpg4)), но совместимые POSIX системы возвращаются 0 только на успех.

С чем Вы не можете полагаться type выходной формат, или будет ли вывод на stdout или stderr.

Невозможно иметь гарантию что результат type соответствия, что происходит, при попытке на самом деле запустить программу. Исполняемый файл, возможно, был добавлен или удален тем временем или может не загрузиться, потому что файл недопустим или потому что нет достаточной памяти. Но если Вы просто надеетесь видеть, существует ли команда и не касавшаяся пограничных случаев, if type somecommand >/dev/null 2>/dev/null; … правильный путь.

1
27.01.2020, 23:38

Вы правы, с помощью спецификации POSIX, поскольку руководство там действительно не является никаким способом сказать то, что считают ошибкой. Таким образом, нет никакого способа гарантировать, что нулевой код выхода означает, что операнд является допустимым именем, существует, а тем более что это - команда.

Похоже, что стандартный вывод не является большим количеством справки ни один (мой акцент):

Стандартный вывод типа содержит информацию о каждом операнде в неуказанном формате. Информация, предоставленная обычно, идентифицирует операнд как встроенную оболочку, функция, псевдоним, или ключевое слово, и, где применимо, может отобразить путь операнда.

Похож необходимо будет использовать некоторую эвристику, например, на основе оболочки, которую Вы используете.

1
27.01.2020, 23:38

Теги

Похожие вопросы