相关疑难解决方法(0)

如何呼应一声巨响!

我试图echo通过将内容写入文件来创建脚本,而不是使用编辑器打开它

echo -e "#!/bin/bash \n /usr/bin/command args"  > .scripts/command
Run Code Online (Sandbox Code Playgroud)

输出

bash: !/bin/bash: 事件未找到

我已将这种奇怪的行为与bang隔离开来。

$ echo !
!  

$ echo "!"
bash: !: event not found

$ echo \#!
#!

$ echo \#!/bin/bash
bash: !/bin/bash: event not found
Run Code Online (Sandbox Code Playgroud)
  • 为什么 bang 会导致这个?
  • bash 所指的这些“事件”是什么?
  • 我如何解决这个问题并将“#!/bin/bash”打印到屏幕或我的文件?

command-line bash echo

62
推荐指数
4
解决办法
4万
查看次数

为什么感叹号 `!` 有时会打乱 bash?

我意识到这!在命令行历史上下文中对命令行具有特殊意义,但除此之外,在运行脚本中,感叹号有时会导致解析错误。
我认为它与 an 有关event,但我不知道事件是什么或它做什么。即便如此,相同的命令在不同情况下的行为也会有所不同。
下面的最后一个示例导致错误;但是为什么,当相同的代码在命令替换之外工作时呢?.. 使用 GNU bash 4.1.5

# This works, with or without a space between ! and p
  { echo -e "foo\nbar" | sed -nre '/foo/! p'
    echo -e "foo\nbar" | sed -nre '/foo/!p'; }
# bar
# bar

# This works, works when there is a space between ! and p
  var="$(echo -e "foo\nbar" | sed -nre '/foo/! p')"; echo "$var"
# bar

# This causes an ERROR, with NO …
Run Code Online (Sandbox Code Playgroud)

bash command-history quoting

15
推荐指数
2
解决办法
1万
查看次数

为什么 Bash 历史记录没有记录这个命令?

该命令会printf "#!/bin/bash\n" > t生成一个错误 ( bash: !/bin/bash\n": event not found),但按向上键不会调用该命令,因此我可以对其进行修改。这是为什么?

(我在这里尝试的东西可以通过printf "%s\n" '#!/bin/bash' >t我尝试学习 Bash 并且真的想了解为什么 bash 历史记录没有捕获上一个printf命令来完成。)

command-line bash printf

7
推荐指数
1
解决办法
2658
查看次数

Bash:同一行内双引号后单引号内的历史扩展

今天在另外两个问题中偶然发现这个现象后,我仔细研究了这个现象。我已经在默认情况下尝试了所有这些set -H(历史扩展打开)。

为了测试脚本,我经常做一些事情,例如echoing 多行字符串并将其通过脚本进行管道传输,但在某些情况下会出现错误:

$ echo "foo
bar" | sed '/foo/!d'
bash: !d': event not found
> 
Run Code Online (Sandbox Code Playgroud)

!尽管用单引号括起来,但似乎会触发历史扩展。问题似乎是在同一行中出现双引号,因为

$echo $'foo\nbar' | sed '/foo/!d'
Run Code Online (Sandbox Code Playgroud)

效果也很好

$echo "foo
bar" |
> sed '/foo/!d'
Run Code Online (Sandbox Code Playgroud)

我的怀疑:历史扩展是按行应用的,所以'后面的单个"被认为是转义的,所以下面的!没有转义。

现在我的问题是:这是一个错误还是预期的行为?复制bash版本为 4.2.30 和 4.4.12。

bash quoting history-expansion

6
推荐指数
1
解决办法
347
查看次数