Bash 在shell中,当我们将命令放在美元符号和圆括号内时,它意味着什么:$(command)
我只想理解shell中的以下代码行。它用于获取当前工作目录。我知道Bash 在shell中,当我们将命令放在美元符号和圆括号内时,它意味着什么:$(command),bash,shell,terminal,sh,ksh,Bash,Shell,Terminal,Sh,Ksh,我只想理解shell中的以下代码行。它用于获取当前工作目录。我知道$(变量)name返回变量名中的值,但是$(命令)应该返回什么?执行命令后是否返回值?在这种情况下,我们可以使用`来执行命令 CWD="$(cd "$(dirname $0)"; pwd)" 在不同版本的shell中,也可以从以下代码行获得相同的输出 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 我无法理解$(cd..和$(dirname的含义
$(变量)
name返回变量名中的值,但是$(命令)
应该返回什么?执行命令后是否返回值?在这种情况下,我们可以使用`
来执行命令
CWD="$(cd "$(dirname $0)"; pwd)"
在不同版本的shell中,也可以从以下代码行获得相同的输出
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
我无法理解$(cd..
和$(dirname
的含义
有人能帮我弄清楚这个命令是如何执行的吗?使用
$
like${HOME}
给出HOME的值。使用$
like$(echo foo)
表示运行子shell中括号内的任何内容并将其作为值返回。在我的示例中,您将得到foo
,因为echo
将foo
写入标准输出
有人能帮我弄清楚这个命令是如何执行的吗
让我们看看命令的不同部分。BASH\u SOURCE
是一个包含源文件名的BASH数组变量。因此“${BASH\u SOURCE[0]}”
将返回脚本文件的名称
dirname
是GNU coreutils提供的一个实用程序,它从文件名中删除最后一个组件。因此,如果您执行脚本时说bash foo
,“$(dirname”${bash_SOURCE[0]}”)
将返回
。如果您说bash../foo
,它将返回。
;对于bash/some/path/foo
它将返回/some/path
最后,整个命令“$(cd”$(dirname“${BASH_SOURCE[0]}”)”&&pwd)
获取包含被调用脚本的绝对目录
<代码> > $(…)<代码>允许命令替换,即允许命令的输出替换命令本身,并且可以嵌套。是的;<代码> $(…)>代码>是编写命令而不是试图使用回引号的更好方法。请考虑编写:<代码> GCclib=$(DrimeNo.$(DrimeN$(GCC)))/lib使用反引号。即使在您遇到在Markdown中使用反引号的困难之前,它也会变得更加困难,因为您必须转义嵌套命令的反引号,而使用
$(…)
符号则不会。从技术上讲,$(echo foo)
创建一个命令替换,而不是子shell。当前的另一个答案是正确的。我认为命令替换是在子shell中运行的,有点像,但它们仍然是不同的概念。@trysis-command substitution,因此值得注意。我知道反勾号产生的结果与$(),但区别纯粹是表面的吗?除了$()更清晰之外,还有理由使用其中一个吗?“$like$(echo foo)的用法意味着运行子shell中括号内的任何内容,并将其作为值返回。”…这令人困惑,因为此命令$(echo foo)
将尝试运行从括号中返回的内容,它将首先运行echo foo
,然后尝试运行foo
,这会导致一个错误,很抱歉迟到了3年,但请您解释一下为什么该语句有效吗?您说的dirname
返回执行文件的路径(相对于或绝对于当前工作目录),cd
将pwd更改为该目录,并且pwd
打印出当前工作目录的绝对路径。但是为什么它们由&
连接?如果cd
失败,DIR
将保持什么?@Christian,&
防止pwd
在cd
失败时运行例如,DIR
将是空的,而不是有一个不正确的目录。下面是一个关于$()
与`
的优缺点的问题:
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"