以下是什么意思:
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
我对这部分特别感兴趣:
varible=$(...)
我知道括号用于执行子进程,但是如果它们与 一起使用怎么办$
?
答案1
来自 Bash 手册 ( man bash
):
命令替换 命令替换允许命令的输出替换 命令名称。有两种形式: $(命令) 或者 `命令` Bash 通过在子 shell 中执行命令来执行扩展 环境并将命令替换替换为标准 命令的输出,删除所有尾随换行符。嵌入式 换行符不会被删除,但在word过程中可能会被删除 分裂。命令替换 $(cat file) 可以替换为 等效但更快 $(< file).
(这适用于所有类似 Bourne 的 shell,即sh
、ksh
、zsh
等bash
,并且zsh
还能够以这种方式捕获嵌入 NUL 字符的数据)
命令
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%/*}"
答案2
这意味着跑步里面是什么括号在一个子外壳和返回那作为价值,在您的情况下将其分配给varible
.
答案3
被叫varible=$(..)
的命令替换它的意思就是运行 shell 命令并将其输出存储到变量或使用 echo 命令显示回来。例如,显示日期和时间:
echo "Today is $(date)"
并将其存储到变量中:
SERVERNAME=$(hostname)
欲了解更多信息:https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/