- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题在这里已经有了答案:
echo "#!" fails -- "event not found"
(5 个回答)
6年前关闭。
我正在尝试解析 VNC 服务器启动事件的输出,但在命令替换中使用 sed 进行解析时遇到了问题。具体来说,远程VNC服务器的启动方式如下:
address1="user1@lxplus.cern.ch"
VNCServerResponse="$(ssh "${address1}" 'vncserver' 2>&1)"
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
echo "${VNCServerResponse}" | sed '/New.*desktop.*is/!d' \
| awk -F" desktop is " '{print $2}'
lxplus0186.cern.ch:1
VNCServerAndDisplayNumber="$(echo "${VNCServerResponse}" \
| sed '/New.*desktop.*is/!d' | awk -F" desktop is " '{print $2}')"
bash: !d': event not found
最佳答案
Bash 历史扩展是 bash 命令行解析器中一个非常奇怪的角落,您显然遇到了意外的历史扩展,下面将对此进行解释。但是,脚本中的任何类型的历史扩展都是意外的,因为通常脚本中没有启用历史扩展;甚至脚本都不能与 source
一起运行(或 .
)内置。
如何启用(或禁用)历史扩展
有两个 shell 选项可以控制历史扩展:
set -o history
: 需要记录历史记录。 set -H
(或 set -o histexpand
):启用历史扩展还需要。 set -o history -o histexpand
source
更复杂(我将要说的仅适用于 bash v4,而且由于它没有记录在 future 可能会改变)。 [注3]
source
中关闭历史记录(以及随之而来的扩展) 'd 脚本,但通过一个内部标志,据我所知,它是不可见的。它肯定不会出现在
$SHELLOPTS
中.自
source
d 脚本在当前 bash 上下文中运行,它共享当前的执行环境,包括 shell 选项。所以在执行一个
source
从交互式 session 启动的 d 脚本,您将看到
history
和
histexpand
在
$SHELLOPTS
,但不会发生历史扩展。为了启用它,您需要:
set -o history
histexpand
shell 选项没有这种副作用。
readline
一起使用,以便它可以在命令输入期间执行。 (默认情况下,此函数绑定(bind)到 Meta-^;通常 Meta 是 ESC,但您也可以自定义它。)但是,它也会在每行输入后立即执行,在执行任何 bash 解析之前。
extglob
已设置,后跟 ( [注 1] bash
为命令替换启动一个新的引用上下文(
$(...)
或已弃用的反引号表示法)。例如:
$ s=SUBSTITUTED
$ # The interior single quotes are just characters
$ echo "'Echoing $s'"
'Echoing SUBSTITUTED'
$ # The interior single quotes are single quotes
$ echo "$(echo 'Echoing $s')"
Echoing $s
# A no-op to indicated history expansion
$ HIST() { :; }
# Single-quoted strings inhibit history expansion
$ HIST
$ echo '!!'
!!
# Double-quoted strings allow history expansion
$ HIST
$ echo "'!!'"
echo "'HIST'"
'HIST'
# ... and it applies also to interior command substitution.
$ HIST
$ echo "$(echo '!!')"
echo "$(echo 'HIST')"
HIST
sed '/foo/!d' file
,您希望单引号可以保护您免受历史扩展,并将其放入双引号命令替换中:
result="$(sed '/foo/!d' file)"
"\!"
禁止历史扩展,它不会删除反斜杠:
$ echo "\!"
\!
# Undesired history expansion
printf "The answer is '%s'\n" "$(sed '/foo/!d' file)"
# Undesired word splitting
printf "The answer is '%s'\n" $(sed '/foo/!d' file)
# Works
sed_prog='/foo/!d'
printf "The answer is '%s'\n" "$(sed "$sed_prog" file)"
# No matching close parenthesis
$ echo "!("
bash: !: event not found
# The matching close parenthesis has nothing to do with the open
$ echo "!(" ")"
!( )
# An actual extended glob: files whose names don't start with a
$ echo "!(a*)"
b
bash
中所示手册中,如果前面紧跟反斜杠,历史扩展字符将被视为普通字符。这确实是真的。反斜杠以后是否会被视为转义字符并不重要:$ echo \!
!
$ echo \\!
\!
$ echo \\\!
\!
\!
不是双引号字符串中的有效转义序列,因此不会删除反斜杠:$ echo "\!"
\!
$ echo "\\!"
\!
$ echo "\\\!"
\\!
关于bash - 如何解决错误 "bash: !d' : event not found"in Bash command substitution,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25003162/
2019-07-04:更新 结束使用 options: env: 不完美,因为在构建步骤中不允许变量,但至少涵盖了环境。 问题 GCP Cloud build不替换 substitutions
我正在使用 NSubstitute。我必须伪造一个类,无法挖掘出 Substitute.For() 的区别和 Substitute.ForPartsOf .我已经阅读了文档,但不明白两者的行为不同。
我正在尝试在 Agda 中使用等递归类型对按推值调用 lambda 演算进行编码。所以我用最多n个自由值类型变量相互定义值类型和计算类型(我只需要用值类型代替等递归类型)如下(这只是一个片段)。 da
有没有办法用s///同时进行替换?例如,如果我有一个带有1、2、3等数字的字符串,并且我想用“tom”代替1,用“mary”代替2,用“jane”代替3,等等? my $a = "1323131323
我有一个使用模板的 Jav::String 类。 class String { String(); String(std::size_t); template String(co
考虑以下 C99 结构,以灵活的数组成员结尾: struct hdr { size_t len; size_t free; char buf[]; }; 例如, len 可以通过这样
我有一个范围,包含数值和空白单元格。一些数值将以 * 作为后缀。 10* 5 7 9 25* 10 当我执行 SUM(A1:A8) 时,我得到 5+7+9+10 = 31 的结果,即所需的输出。
有没有办法一次交换多个字符串实例而不嵌套? 例如,假设我想从字符串中删除以下值的所有实例: 目标 沃尔玛 简历 输入字符串: “我去了 Target 而不是沃尔玛,但我真的很想去 CVS” 输出字符串
我在 Vim 的 substitute 中遇到了一个行为。 - 我不能的命令 真正遵循: 给定以下包含 && 的代码行我想要的序列 替换 &&与 &&和换行符: return a && b 在我的第一
为了说明我的问题,请使用以下简单示例。 我希望能够将“替换”和“那个”之间的任何文本替换为“完成”。例如,以下两个字符串: blah blah blah replace this and that b
我之前问过一个关于How to take in text/character argument without quotes的问题.在我在那个问题中提供的场景中,参数的数量是固定的,所以我在函数定义中
我正在尝试将一些 Selenium HTML 测试转换为使用 WebDriver 2.0 框架。根据网站 (http://seleniumhq.org/docs/03_webdriver.html),
那应该很容易...如何在下图中的标题中以粗体显示 i (=1)(仅调整参数 main)? i <- 1 plot(0~0, main=substitute(bold("foo"~i.~"bar"),
那应该很容易...如何在下图中的标题中以粗体显示 i (=1)(仅调整参数 main)? i <- 1 plot(0~0, main=substitute(bold("foo"~i.~"bar"),
这是一个现有的通用 css 规则(原始文件): .caption-top { color: red; } 这是示意图,因为在现实生活中,我需要根据上下文将 .caption-top 选择器变成其他
这是我的代码: $(".tooltip").live('click', function() { var texte = $('#tiptip_content').text(); $(
我需要帮助将变量子化为正则表达式 这条线工作正常: subject = subject.replace(//g, emoticons[1]); 我需要为变量切换单词“Smile”。 我尝试了一些不同的
我读了一篇摘要,其中在谈到继承时总是使用“替代原则”的定义。但并没有解释这个原理的含义。 这个原理是什么? 谢谢。 最佳答案 意思很简单:子类必须遵守父类(super class)设定的契约。 如果你
我有一个变量,它是一个 url,我想在 bash 中替换该 url 的一部分,但我一直收到“错误的替换” URL="http://hostname/project/branches/Old_Branc
#!/bin/bash jobname="job_201312161447_0003" jobname_pre=${jobname:0:16} jobname_post=${jobname:17} 这
我是一名优秀的程序员,十分优秀!