当运行此脚本时:
为什么
#!/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
如果没有子Shell,basename
就可以工作:
$ basename /Users/mles/.ssh/id_rsa.pub
id_rsa.pub
为什么
basename
在子shell中无法工作?如果这跟我的Mac有关,那怎么办?
PATH
有特殊的意义。因此,您应该使用小写名称来命名自己的变量,以避免错误地覆盖更改 shell 或操作系统行为的变量。换句话说:path=$1
不会有任何风险。 - Charles Duffy#!/bin/bash
作为你的shebang,而不是#!/bin/sh
。使用sh
shebang不能保证你将拥有除POSIX shell语言规范中给出的语言特性之外的任何语言特性。 - Charles Duffybasename
的参数中的扩展进行引用,以便正确处理包含空格的路径,或者当 IFS 被设置为包含可能存在于文件名中的字符时;花括号在这里没有任何区别,但引号可防止字符串分割和通配符扩展。 - Charles Duffy