请帮助查看是否有某种方法可以使下面的脚本可行?
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有些重复,我的错是原始问题的描述不够清晰和准确,我尝试创建一个新问题,使其更具体和清晰。
答案 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"