При запуске этого скрипта:
#!/bin/sh -ex
if [[ $# -ne 1 ]]; then
echo "./import-public-ssh-key.sh <absolute path to public key>"
exit 1;
fi
PATH=$1
KEY=$(basename ${PATH})
Я получил:
./import-public-ssh-key.sh: line 9: basename: command not found
без подоболочки basename
работает:
$ basename /Users/mles/.ssh/id_rsa.pub
id_rsa.pub
Почему basename
не работает в подоболочке? Я на Mac, если это актуально.
PATH
имеет особое значение. Вот почему вы должны использовать имена в нижнем регистре для своих собственных переменных, чтобы избежать перезаписи тех, которые по ошибке изменяют поведение оболочки или ОС. То есть:path=$1
не будет рисковать никакими проблемами. - person Charles Duffy   schedule 29.12.2018sh -e
... спорный вопрос; он легко может вызвать больше ошибок, чем предотвратить, в том числе странным образом зависящих от контекста, которые ускользают от простых попыток тестирования. См. упражнения в BashFAQ #105 и список несовместимостей между различными реализациями на in-ulm.de/~mascheck/various/set-e прежде чем принять решение об его использовании. - person Charles Duffy   schedule 29.12.2018#!/bin/bash
, а не#!/bin/sh
, как ваш шебанг; использованиеsh
шебанга не гарантирует, что у вас будут доступны какие-либо языковые функции, кроме тех, которые указаны в спецификации языка оболочки POSIX). - person Charles Duffy   schedule 29.12.2018basename
-- таким образом,key=$(basename "$path")
-- для правильной работы с путями, содержащими пробелы, или когда IFS иначе set, чтобы содержать символы, которые могут существовать внутри ваших имен файлов; фигурные скобки здесь не имеют никакого значения, так или иначе, но кавычки предотвращают разделение строк и расширение универсальных объектов). - person Charles Duffy   schedule 29.12.2018path
имеет особое значение в C-shell, но я думаю, что мы не будем опускаться так низко. - person cdarke   schedule 29.12.2018