【问题标题】:What does $() do?$() 是做什么的?
【发布时间】:2016-01-22 03:54:15
【问题描述】:

尝试解决此问题:

https://unix.stackexchange.com/questions/128894/ssh-exchange-identification-connection-closed-by-remote-host-not-using-hosts-d

一种解决方案的一部分是使用:

$(which sshd)

在我的例子中输出:

Could not load host key: /etc/ssh_host_rsa_key
Could not load host key: /etc/ssh_host_dsa_key

我为我的所有 bash 命令保留了一份备忘单,并想添加:

$()

它似乎正在对 sshd 可执行文件执行某些操作。

相关

What does it mean in shell when we put a command inside dollar sign and parentheses: $(command)

【问题讨论】:

  • 在链接页面上这是一个糟糕的建议。几乎没有理由只在sshd 那里。也使用which 而不是type 很差(虽然很常见)。
  • 字体有什么好处?
  • 它是一个内置的 shell,保证存在并具有 POSIX 指定的行为。 which 不是这些东西。
  • @EtanReisner 链接的答案解释了为什么它推荐这个以及为什么简单地使用 sshd 不起作用。
  • @Random832 这个原因不包括不使用type,尽管它不仅包括使用sshd

标签: bash shell


【解决方案1】:

$() 是一种执行另一个进程并收集其输出的方法。详情请见http://wiki.bash-hackers.org/syntax/expansion/cmdsubst

当这样的表达式被传递给 bash,它的输出 被执行。它使用其完整路径有效地调用命令,因为这就是 which 返回的内容。打印的消息来自该表达式启动的 sshd 进程。

注意which 定位可执行扫描$PATH,与执行命令时相同。换句话说,执行which输出不会影响运行哪个可执行文件,只会影响操作系统跟踪的可执行文件的完整路径。

【讨论】:

  • 值得注意的是,无论which 只知道查看bash 将使用的相同PATH,因此该命令应该执行。无论哪种方式,您都可以获得相同的命令集。所以$(which foo) 的唯一作用应该是你可以在pstop 中看到整个路径。
【解决方案2】:

$(which sshd) 将替换为 由运行 which sshd 产生的标准输出which sshd 将返回调用sshd 时调用的可执行文件的完全限定路径:

which 返回将在当前环境中执行的文件(或链接)的路径名,如果它的参数是 在严格符合 POSIX 的 shell 中作为命令给出。它通过在PATH 中搜索与 参数的名称。它不遵循符号链接。

示例,在命令行上运行,其中> 表示输入提示:

COMMAND: which sshd
 OUTPUT: /usr/sbin/sshd

COMMAND: echo "The full path of sshd is $(which sshd)"
 OUTPUT: The full path of sshd is /usr/sbin/sshd

COMMAND: $(which sshd)
 OUTPUT: [[whatever output you get from running /usr/sbin/sshd]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 2011-11-01
    • 2010-11-24
    • 2015-04-27
    • 2012-02-28
    • 2011-07-15
    相关资源
    最近更新 更多