以下是什么意思:
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
我对这部分感兴趣:
varible=$(...)
我知道括号用于执行子流程,但是如果将其与一起使用会$怎样?
以下是什么意思:
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
我对这部分感兴趣:
varible=$(...)
我知道括号用于执行子流程,但是如果将其与一起使用会$怎样?
Answers:
在Bash手册(man bash)中:
命令替换
命令替换允许命令输出替换
命令名称。有两种形式:
$(命令)
要么
`命令`
Bash通过在子Shell中执行命令来执行扩展
环境并用标准替换命令替换
命令的输出,并删除所有尾随的换行符。嵌入式的
不会删除换行符,但是在单词过程中可能会删除它们
分裂。命令替换$(cat文件)可以替换为
等价但更快的$(<文件)。
(本作也是如此所有类似Bourne外壳,即sh,ksh,zsh,bash等,并且zsh还能够捕获数据以这种方式嵌入的NULL字符)
命令
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
会将脚本所在目录的名称(同时还将所有反斜杠更改为正斜杠)分配给变量basedir。输出到标准错误流的任何错误,警告或其他诊断消息仍将显示在终端上($(...)仅捕获命令的标准输出)。
Shell将通过执行最里面的命令替换开始:
echo "$0" | sed -e 's,\\,/,g'
的输出将作为字符串提供给dirname,并将其输出分配给变量basedir。
使用双引号确保不会进行单词拆分或文件名混淆,否则当$0(脚本名称(包括用于执行该脚本的路径)在内)包含空格时,您可能会发现脚本失败或产生奇怪的输出字符或文件名通配符(例如?或*)。
通常,总是引用扩展名(变量扩展,命令替换和算术扩展)是一个好主意。请参阅此问题及其答案,以很好地解释为什么这是一个好主意。
如果脚本执行为
$ /usr/local/bin/script.sh
然后basedir将获得的值/usr/local/bin。
或者,在Cygwin上:
$ bash c:\\Users\\Me\\script.sh
然后basedir将获得的值c:/Users/Me。在这种情况下,命令行上的双反斜杠只是为了从shell中转义单个反斜杠。的实际值$0是c:\Users\Me\script.sh。
做同样的事情,而无需使用的另一种方式dirname,echo并sed会
basedir="${0//\\//}"
basedir="${basedir%/*}"
/bin/shSolaris 10或更早版本)不支持$(...)。
在varible=$(..)所谓的命令替换它的手段罢了,但运行shell命令,并将其输出存储到一个变量或显示回用echo命令。例如,显示日期和时间:
echo "Today is $(date)"
并将其存储到变量中:
SERVERNAME=$(hostname)
有关更多信息:https : //www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/
man bash并搜索Command替代