因为我大部分时间都在 IPython shell 中度过,所以我有一个坏习惯,即在终端命令前加上感叹号。通常,这只会导致错误,但有时,它会导致一些不好的事情发生。我可以有效地禁用!终端中的功能吗?这是否有干扰任何脚本的风险?
假设我的 中有以下简单示例history:
...
76 cd ~
77 ./generator.sh out.file
78 cp out.file ~/out/
79 ./out/cleaner.sh .
80 ls -alnh /out
...
Run Code Online (Sandbox Code Playgroud)
如果我想在一个命令中执行命令77、78和79,是否存在快捷方式?我试过!77 !78 !79,它只会将它们全部放在一行上执行。
我有一个名为foo.sh的简单 bash 脚本,如下所示:
#!/bin/bash
echo "Foo!"
Run Code Online (Sandbox Code Playgroud)
当我在./foo.sh收到Foo!消息时运行它时,一切都很好。但是,如果我echo "Foo!"直接从控制台,然后我得到预期的行为和信息:bash: !": event not found。
我知道 the!是作为前一个命令显示的,如果在 pe 单引号内使用,则将其视为文字。我只是想知道用它运行脚本有什么区别echo "Foo!"(即使是source ./foo.sh工作,但直接从控制台它没有。
在很长的一行中,我将总结为:
(foo),(bar,baz(word,right),(end)
Run Code Online (Sandbox Code Playgroud)
我只想打印:
(bar,baz(word,right
Run Code Online (Sandbox Code Playgroud)
为了匹配第二个括号,我排除了第三个后面的单词:
$ grep -oP "\\(.*(?!word).*right"
Run Code Online (Sandbox Code Playgroud)
但是 Bash 解释了感叹号:
-bash: !word: 事件未找到
用单引号保护感叹号失败grep: missing )
$ grep -oP '\\(.*(?!word).*right'
$ grep -oP '\\((?!word)(.*right)'
Run Code Online (Sandbox Code Playgroud)
用反斜杠保护感叹号失败grep: unrecognized character after (? or (?-
任何的想法?
注意:-P用于 Perl 正则表达式,-o仅打印一行的匹配部分
我想重命名一系列以这种方式命名的文件
name (10).ext
name (11).ext
...
Run Code Online (Sandbox Code Playgroud)
到
name_10.ext
name_11.ext
...
Run Code Online (Sandbox Code Playgroud)
这个单行作品:
$ for i in name\ \(* ; do echo "$i" | sed -e 's! (\([0-9]\{2\}\))!_\1!' ; done
name_10.ext
name_11.ext
...
Run Code Online (Sandbox Code Playgroud)
但这个没有:
$ for i in name\ \(* ; do mv "$i" "$(echo "$i" | sed -e 's! (\([0-9]\{2\}\))!_\1!')" ; done
bash: !_\1!': event not found
Run Code Online (Sandbox Code Playgroud)
为什么?如何避免这种情况?
使用
$ bash --version
GNU bash, versione 4.3.48(1)-release (x86_64-pc-linux-gnu)
Run Code Online (Sandbox Code Playgroud)
在 Ubuntu 18.04 上。
虽然在这个类似的问题中显示了一个简单的情况!,但这里!只考虑了!内部单引号,并将其与内部单引号、内部双引号进行比较。正如评论中所指出的,Bash 在这两种情况下的行为方式不同。这是关于 …