怎么赚$!在`sh -c“$!里面工作!”`

时间:2018-01-02 13:39:43

标签: bash shell

请帮助查看是否有某种方法可以使下面的脚本可行?

name='bob'
# below script reports 'bash: !: event not found' error
sh -c "echo $name; sleep 20 & pid1=$!; sleep 10 & pid2=$!; echo \"pid1: $pid1, pid2: $pid2\"" 
# below script $name will not become bob
sh -c 'echo $name; sleep 20 & pid1=$!; sleep 10 & pid2=$!; echo \"pid1: $pid1, pid2: $pid2\"' 

[添加01/03]

这个问题与this one有些重复,我的错是原始问题的描述不够清晰和准确,我尝试创建一个新问题,使其更具体和清晰。

2 个答案:

答案 0 :(得分:1)

似乎试图解决event not found问题。

当您在Bash中使用set -H并在交互式命令中使用感叹号时(在单引号或反斜杠转义之外),就会发生这种情况。

我已发布an answer,我认为有六条评论解释了正在发生的事情以及如何解决问题。

set +H

此命令禁用在交互式会话中使用感叹号的Bash历史记录机制。

此外,在双引号内,您必须转义美元符号才能将其逐字传递给子shell。

sh -c "echo \"$name\"
    sleep 20 & pid1=\$!
    sleep 10 & pid2=\$!
    echo \"pid1: \$pid1, pid2: \$pid2\"" 

答案 1 :(得分:1)

The comments propose mixing quotes and disabling history expansion, but a better solution (IMO) is to pass the name as a parameter:

sh -c 'echo "$1"; sleep 20 & pid1=$!; ...' sh "$name"