相关疑难解决方法(0)

Bash中单引号和双引号之间的区别

在Bash中,单引号('')和双引号("")之间有什么区别?

syntax bash shell quotes

501
推荐指数
6
解决办法
17万
查看次数

如何逃避历史扩展感叹号!在一个双引号"命令替换,如"$(echo'!b')"?

编辑:命令替换对于令人惊讶的行为不是必需的,尽管它是最常见的用例.同样的问题适用于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 …

syntax bash quotes

16
推荐指数
1
解决办法
5171
查看次数

unix中shell命令的"找不到事件"错误

当我试图删除连续的重复行

awk "!x[$0]++" file

它的报道 x[: Event not found.

甚至同样的情况

sed -i -e "$!N; /^\(.*\)\n\1$/!P;D" file 以及报告

N: Event not found. 我也试过单引号,但没有帮助

任何想法来解决这些问题

unix shell awk sed tcsh

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

如何在bash中逃避感叹号?

有时我觉得有必要在我的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中的感叹号?

bash

9
推荐指数
4
解决办法
6391
查看次数

Perl Regex命令行问题

我试图在命令行中的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)中试过了,效果很好,所以我不确定为什么它在这里不起作用

regex bash perl

9
推荐指数
2
解决办法
132
查看次数

多行双引号字符串会触发随后通过管道传送的单引号命令的历史记录扩展

我在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)

bash gnu command-substitution

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

如何在bash中打印感叹号?

我需要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必须在文件中.由于某种原因,执行该脚本的二进制文件将不会读取该文件.

unix linux bash scripting

6
推荐指数
2
解决办法
4412
查看次数

如何在Bash命令替换中解决错误"bash:!d':event not found"

我试图解析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的方式似乎是一个问题.我很感激指导.

bash parsing sed command-substitution

5
推荐指数
2
解决办法
4549
查看次数

设置环境变量以 "-bash: !": event not found" 结尾

我正在为 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)

想法??

我希望这能奏效,事实上我以前有过它的工作。

gmail firebase nodemailer google-cloud-functions

3
推荐指数
1
解决办法
558
查看次数

理解如何在命令行中转义字符所需的bash提示

我对命令行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命令行中转义?包括如何在我的示例中正确输出换行符和感叹号.

bash escaping

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

!在字符串中使它在命令行中不可用 - 错误消息"找不到事件"

这是一个非常简单的问题,我无法找到答案.

我有一个字符串,如"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

bash shell

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

“未找到事件”试图导出带有!0的字符串

当我尝试使用时export password="abcd!0",基准给了我一个错误: !0: event not found

有什么解决的办法吗?

bash

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