编辑:命令替换对于令人惊讶的行为不是必需的,尽管它是最常见的用例.同样的问题适用于echo "'!b'"
b=a
# Enable history substitution.
# This option is on by default on interactive shells.
set -H
echo '!b'
# Output: '!b'
# OK. Escaped by single quotes.
echo $(echo '!b')
# Output: '!b'
# OK. Escaped by single quotes.
echo "$(echo '$b')"
# Output: '$b'
# OK. Escaped by single quotes.
echo "$(echo '!b')"
# Output: history expands
# BAD!! WHY??
Run Code Online (Sandbox Code Playgroud)
!什么?echo "$(echo '$b')"呢?!和之间有什么区别$?echo $(echo …当我试图删除连续的重复行
awk "!x[$0]++" file
它的报道 x[: Event not found.
甚至同样的情况
sed -i -e "$!N; /^\(.*\)\n\1$/!P;D" file 以及报告
N: Event not found.
我也试过单引号,但没有帮助
任何想法来解决这些问题
有时我觉得有必要在我的git提交消息中加入一些表达性.不幸的是,bash似乎并不喜欢这样.
iblue@silence ~/git/wargames $ git commit -m "Frustrating <insert object of frustration here>!"
-bash: !": event not found
Run Code Online (Sandbox Code Playgroud)
使用反斜杠转义有帮助,但这包括提交消息中的反斜杠.
如何正确地逃避bash中的感叹号?
我试图在命令行中的perl中使用负前瞻:
echo 1.41.1 | perl -pe "s/(?![0-9]+\.[0-9]+\.)[0-9]$/2/g"
Run Code Online (Sandbox Code Playgroud)
得到一个看起来像这样的增量版本:
1.41.2
Run Code Online (Sandbox Code Playgroud)
但它只是返回我:
![0-9]+\.[0-9]+\.: event not found
Run Code Online (Sandbox Code Playgroud)
我已经在regex101(PCRE)中试过了,效果很好,所以我不确定为什么它在这里不起作用
我在GNU bash,版本4.3.11.
假设我想在文件上打印唯一的行.我正在使用这种方法,它适用于文件:
$ cat a
9
10
9
11
$ awk '!seen[$0]++' a
9
10
11
Run Code Online (Sandbox Code Playgroud)
但是,如果我从stdin获取输入,在多行中使用双引号并输入到awk,则会失败:
$ echo "9
> 10
> 9
> 11" | awk '!seen[$0]++'
bash: !seen[$0]++': event not found
Run Code Online (Sandbox Code Playgroud)
也就是说,bash尝试扩展命令seen,这当然不知道,因为它是一个变量名.但它不应该发生,因为命令放在单引号内.
echo单引号,多行输入效果很好:
$ echo '9
> 10
> 9
> 11' | awk '!seen[$0]++'
9
10
11
Run Code Online (Sandbox Code Playgroud)
有趣的是,它也适用于双引号的单行输入:
$ printf "9\n10\n9\n11" | awk '!seen[$0]++'
9
10
11
Run Code Online (Sandbox Code Playgroud)
我想知道为什么Bash试图扩展历史,如果它发生在多线输入后,即使命令本身使用单引号.
其他考虑:
中间有一个管道也无法修复它:
$ echo "9
> 10
> 9
> 11" | cat - …Run Code Online (Sandbox Code Playgroud) 我需要printf一个简单的脚本并将输出重定向到一个文件,但是当我这样做时:
printf "#!/bin/bash\ntouch /tmp/1234567890_$RUN" > /tmp/password-change-script_$RUN.sh
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
bash:!/ bin/bash \ntouch:找不到事件
如果我逃避感叹号:
printf "#\!/bin/bash\ntouch /tmp/1234567890_$RUN" > /tmp/password-change-script_$RUN.sh
Run Code Online (Sandbox Code Playgroud)
然后转义字符仍然存在于文件中.
cat /tmp/password-change-script_$RUN.sh
#\!/bin/bash
touch /tmp/1234567890_111
Run Code Online (Sandbox Code Playgroud)
顺便说一句,在这种特殊情况下,#!/ bin/bash必须在文件中.由于某种原因,执行该脚本的二进制文件将不会读取该文件.
我试图解析VNC服务器启动事件的输出,并在命令替换中使用sed解析时遇到问题.具体来说,远程VNC服务器的启动方式如下:
address1="user1@lxplus.cern.ch"
VNCServerResponse="$(ssh "${address1}" 'vncserver' 2>&1)"
Run Code Online (Sandbox Code Playgroud)
然后解析在此启动事件中生成的标准错误输出,以便提取服务器和显示信息.此时变量的内容VNCServerResponse如下所示:
New 'lxplus0186.cern.ch:1 (user1)' desktop is lxplus0186.cern.ch:1
Starting applications specified in /afs/cern.ch/user/u/user1/.vnc/xstartup
Log file is /afs/cern.ch/user/u/user1/.vnc/lxplus0186.cern.ch:1.log
Run Code Online (Sandbox Code Playgroud)
可以通过以下方式解析此输出,以便提取服务器并显示信息:
echo "${VNCServerResponse}" | sed '/New.*desktop.*is/!d' \
| awk -F" desktop is " '{print $2}'
Run Code Online (Sandbox Code Playgroud)
结果如下:
lxplus0186.cern.ch:1
Run Code Online (Sandbox Code Playgroud)
我想要做的是在命令替换中使用此解析,如下所示:
VNCServerAndDisplayNumber="$(echo "${VNCServerResponse}" \
| sed '/New.*desktop.*is/!d' | awk -F" desktop is " '{print $2}')"
Run Code Online (Sandbox Code Playgroud)
在尝试这样做时,我收到以下错误:
bash: !d': event not found
Run Code Online (Sandbox Code Playgroud)
我不知道如何解决这个问题.在命令替换中使用sed的方式似乎是一个问题.我很感激指导.
我正在为 firebase 设置一个典型的电子邮件功能,以便在添加新记录时提醒我。在我的终端中,我输入以下内容:
firebase functions:config:set gmail.email="MyEmail@gmail.com" gmail.password="MyPassword1!"
Run Code Online (Sandbox Code Playgroud)
这将返回错误:-bash: !": event not found
如果我愿意,我可以只设置电子邮件并且它工作正常,但是设置密码让我遇到了这个问题。所以,这有效:
firebase functions:config:set gmail.email="MyEmail@gmail.com"
Run Code Online (Sandbox Code Playgroud)
这不会:
firebase functions:config:set gmail.email="MyEmail@gmail.com" gmail.password="MyPassword1!"
Run Code Online (Sandbox Code Playgroud)
或者
firebase functions:config:set gmail.password="MyPassword1!"
Run Code Online (Sandbox Code Playgroud)
想法??
我希望这能奏效,事实上我以前有过它的工作。
我对命令行bash的了解在特定领域缺失:我经常忘记如何正确地逃避角色.今天我想将这个字符串回显到一个文件中:
#!/bin/env bash
python -m SimpleHTTPServer
Run Code Online (Sandbox Code Playgroud)
但是,这失败了:
echo "#!/bin/env bash\npython -m SimpleHTTPServer" > server.sh && chmod +x server.sh
-bash: !/bin/env: event not found
Run Code Online (Sandbox Code Playgroud)
这是正确的:记住逃避!或bash会认为这是一个特殊的bash事件命令.
但我无法逃脱!\!收益率\!在呼应字符串,也是如此\\!.
此外,\n不会转换为换行符.
你有一些一般性的提示,让我更容易理解逃避规则吗?
要非常精确,我会接受一个答案,告诉我哪些字符应该在bash命令行中转义?包括如何在我的示例中正确输出换行符和感叹号.
这是一个非常简单的问题,我无法找到答案.
我有一个字符串,如"ASDGFasd#!dasd",我想作为参数进入命令行,例如
python test.py "ASDGFasd#!dasd"
Run Code Online (Sandbox Code Playgroud)
这不会运行带有提供的字符串的test.py(正如我想要的那样),而是返回:
bash: !dasd: event not found
Run Code Online (Sandbox Code Playgroud)
怎么解决这个?
我正在使用ubuntu 14.04 LTS和python 2.7
当我尝试使用时export password="abcd!0",基准给了我一个错误: !0: event not found
有什么解决的办法吗?