Questions tagged «here-document»

5
无法缩进Heredoc以匹配嵌套的缩进
如果有一个“第一世界问题”来编写脚本,就是这样。 我要更新的脚本中包含以下代码: if [ $diffLines -eq 1 ]; then dateLastChanged=$(stat --format '%y' /.bbdata | awk '{print $1" "$2}' | sed 's/\.[0-9]*//g') mailx -r "Systems and Operations <sysadmin@[redacted].edu>" -s "Warning Stale BB Data" jadavis6@[redacted].edu <<EOI Last Change: $dateLastChanged This is an automated warning of stale data for the UNC-G Blackboard Snapshot …

2
如何将输出重定向与here-document和cat结合使用?
假设我有一个脚本,该脚本想通过管道传递到另一个命令或重定向到文件(sh示例使用管道)。假设我正在使用bash。 我可以使用echo: echo "touch somefile echo foo > somefile" | sh 我也可以使用cat以下方法做几乎相同的事情: cat << EOF touch somefile echo foo > somefile EOF 但是,如果我将“ EOF”替换为“ EOF | sh”,它只是认为这是heredoc的一部分。 如何使它cat从stdin输出文本,然后将其通过管道传输到任意位置?

1
POSIX在命令替换内对此处引用的文档有何要求?
在此问题中,有人报告了一个使用here文档的问题,该文档在$(...)命令替换中使用带引号的定界符单词,其中\文档内部行末尾的反斜杠触发换行-换行,而在命令替换之外的相同here文档可以按预期工作。 这是一个简化的示例文档: cat <<'EOT' abc ` def ghi \ jkl EOT 这包括在行尾包含一个反引号和一个反斜杠。用引号引起来,因此主体内部不会发生扩展。在所有与伯恩相似的地方,我都能找到逐字逐句输出的内容。如果我将相同文档放在命令替换中,如下所示: x=$(cat <<'EOT' abc ` def ghi \ jkl EOT ) echo "$x" 然后它们不再表现相同: dash,ash,zsh,ksh93,BusyBox的ash,mksh,和SunOS 5.10 POSIX sh都给予该文件的逐字内容,如前。 Bash 3.2针对不匹配的反引号给出了语法错误。使用匹配的反引号,它尝试将内容作为命令运行。 Bash 4.3将“ ghi”和“ jkl”折叠到一行上,但是没有错误。该--posix选项不影响此。Kusalananda 告诉我(谢谢!)的pdksh行为也是如此。 在最初的问题中,我说这是Bash解析器中的错误。是吗?[更新:是 ]我可以从POSIX(全部来自Shell命令语言定义)中找到相关文本: §2.6.3命令替换: 使用$(command)格式,在右括号后到匹配的右括号后的所有字符构成命令。可以将任何有效的Shell脚本用于命令,但仅由重定向组成的脚本会产生未指定的结果。 §2.7.4此处文档: 如果对单词的任何部分加引号,则应通过对单词执行引号删除来形成定界符,并且此处文档行不得扩展。 第2.2.1节转义符(反斜杠): 如果<newline>跟在<backslash>之后,则外壳程序应将其解释为行继续。在将输入拆分为令牌之前,应删除<backslash>和<newline>。 §2.3令牌识别: 当io_here标记已被语法识别时(请参见Shell Grammar),紧接在下一个NEWLINE标记之后的一个或多个后续行构成一个或多个here-document的主体,并应根据Here-rule的规则进行解析-文件。 当不处理io_here时,外壳程序应通过将下面的第一个适用规则应用于其输入中的下一个字符,将其输入分解为令牌。... ... 如果当前字符是<反斜杠>,单引号或双引号,并且未加引号,则它将影响到后续字符的引号,直到引号文本的末尾。对引用的规则中所描述的引用。在令牌识别期间,不得实际执行任何替换,并且结果令牌应完全包含输入中出现的字符(<newline>联接除外),且未修改,包括在末尾之间的任何嵌入式或封闭引号或替换运算符。引用文字的内容。 …

1
在Heredoc中传递和设置变量
我有一个脚本,必须在许多不同的远程计算机上执行许多不同的事情。我以为Heredoc可以解决这个问题,但是我无法使用脚本中其他地方定义的变量和 Heredoc中定义的变量。 这是一些代码: #!/bin/sh FOO="foo" ssh some.remote.host << EOF BAR="bar" echo "FOO=$FOO" echo "BAR=$BAR" EOF 这只会打印以下内容: FOO = BAR =酒吧 但是,如果我这样引用EOF行: ssh some.remote.host << "EOF" 那么它仅显示以下内容: FOO = foo BAR = 关于如何在Heredoc中使用这两个变量的任何提示? 谢谢。

3
bash脚本错误stty:标准输入:设备的ioctl不适当
我在bash脚本中使用here-documents来自动执行安装和设置,而该操作需要多次输入密码。我输入一次密码,脚本将其传递给各种命令。在大多数情况下,此处文档方法可以很好地解决这一问题。但是,在一种情况下,我得到此错误: Enter VNC password: stty: standard input: Inappropriate ioctl for device Verify password: stty: standard input: Inappropriate ioctl for device 请注意,此错误消息来自x11vnc -storepassword(而不是来自)sudo。 我的问题与x11vnc -storepasswd,这是我的代码: sudo x11vnc -storepasswd ~/.vnc/passwd << ENDDOC password password y ENDDOC 显然(由于错误)不起作用。我将感谢一个如何sudo x11vnc -storepasswd ~/.vnc/passwd在脚本中实现的可行示例。 如果有帮助,则提示如下所示: 输入VNC密码: 验证密码: 将密码写入/home/user/.vnc/passwd?[y] / nn 使用expect会是更好的解决方案吗?如果是这样,在这种情况下我将如何使用它?(我以前从未使用expect过,但是自发布此问题以来,我查看了很多示例,因此我无法expect独自工作。)

1
可以在bash中使用多个here-docs吗?
可以使用多个here-docs在bash中为命令提供输入吗? $ cat <<<foo <<<bar bar $ cat <<EOF1 <<EOF2 > foo > EOF1 > bar > EOF2 bar 显然,在两种情况下,第二个here-doc都用作stdin,并替换了第一个引用。是使用echos 的解决方案吗? $ cat <(echo -n foo) <(echo bar) foobar 另外,由于某种原因,使用组合对我不起作用。为什么会这样呢? $ cat <<<foo <(echo bar) bar $ cat <(echo -n foo) <<<bar foo

3
如何将Bash的流程替换与HERE文档结合在一起?
在Bash 4.2.47(1)-发行版中,当我尝试对来自HERE-dcoument的格式化文本进行分类时,如下所示: cat <(fmt --width=10 <<FOOBAR (I want the surrounding parentheses to be part of the HERE-document) (Even the preceding unbalanced parenthesis should be part of it. FOOBAR ) # I want this paranthesis to end the process substitution. 我收到以下错误: bash: bad substitution: no closing `)' in <(fmt --width=10 <<FOOBAR …

3
如何理解“ cat> file_name << blah”命令?
在以下命令中,cat接受here-doc的内容并将其重定向到名为conf的文件: cat &gt; conf &lt;&lt; EOF var1="cat" var2="dog" var3="hamster" EOF 如何在这里了解命令的顺序?bash首先是否要处理其他所有内容(here-doc部分),最后看是否要处理&gt; conf?

2
如何在新的tmux会话中执行代码-从当前会话中执行?
我使用Ubuntu 16.04,并且我需要以下tmux解决方案,因为我想运行一个超时过程,sleep因为在我的特殊情况下,我不满意at并遇到了nohup(合并时nohup-sleep)的错误。现在,它tmux似乎是最好的选择,因为它具有自己的无挂机机制,并且在手动使用中实际上运行良好(我问的问题仅在于使我已经可以手动完成的流程自动化)。 我需要的: 我需要一种方法可以一次完成以下3个动作: 附加新tmux会话。 向该会话注入一组准备好的命令,例如(sleep 30m ; rm -rf dir_name ; exit)。我特别希望使用多行设置,而不是一排排。 在新tmux会话中将其完成写为stdin的那一刻执行上面的命令。 换句话说,我想在另一个tmux专门为此创建的会话中执行代码集,但是要一次完成所有操作。 笔记: 我的目标是在我最初的工作会议上做所有事情(我大部分时间都在工作)。通常,我无意访问新创建的会话,我只想使用自动执行的代码来创建它,仅此而已。 如果可能的话,我希望有一个Heredoc解决方案。我认为这是最有效的。

4
为什么heredoc中的JSON内容不可解析?
我有一个JSON片段。 以下内容不起作用: VALUE=&lt;&lt;PERSON { "type": "account", "customer_id": "1234", "customer_email": "jim@gmail.com" } PERSON echo -n "$VALUE" | python -m json.tool 结果是: JSON对象无法解码 对进行相同的操作jq,即 echo -n "$VALUE" | jq '.' 没有输出。 对于以下情况,存在相同的行为: VALUE=&lt;&lt;PERSON '{ "type": "account", "customer_id": "1234", "customer_email": "jim@gmail.com" }' PERSON echo -n "$VALUE" | python -m json.tool 响应: JSON对象无法解码 但是以下工作原理: …

3
bash:在只读根分区上使用read <<<“ $ VARIABLE”时出现一些问题。任何已知的解决方法?
碰巧的是,我不得不使用我的ATA-ID-to-device-name脚本(在这里找到:https : //serverfault.com/questions/244944/linux-ata-errors-translating-to-a-device-name/ 426561#426561)在只读 /分区上。如果您感到好奇,它是一个Ubuntu恢复控制台,可让您访问/分区,但默认情况下会将其挂载为只读。我对此感到高兴,因为否则我可能永远都不会发现我的脚本由于以下特定行而在R / O系统上的行为异常: IFS=: read HostMain HostMid HostSub &lt;&lt;&lt; "$HostFull" 这并不会在没有写权限的工作。我不会以为它会失败。但是显然,&lt;&lt;&lt;操作员确实需要将一些临时文件写入某个位置。 但是,有什么方法可以避免创建临时文件,或者有什么方法可以指定将文件写入的位置?在Ubuntu恢复控制台中,对/run目录有-非常好-的写权限,如果我能以某种方式“说” read将临时文件写到比平常其他地方的位置,则可以这样做。

3
将SQL查询的输出分配给变量
我正在连接到oracle数据库并触发查询并将输出分配给变量,但是当我回显该变量的值时,它将无法正确打印。 count=`sqlplus -s $configuser/$configpass@$ORACLE_SID &lt;&lt;END set pagesize 0 feedback off verify off heading off echo off; select max(cust_id) from cutomers exit; END` echo $count 在数据库上触发查询返回正确的结果。但是“ count”变量的值不正确。

3
使用here-doc处理sed和文件
我想对sed命令使用here-doc,并提供要读取的文件和输出文件。 我看过Advanced Bash Scripting指南中的Here-Documents,但是在使用Here -doc时没有提及任何有关常规参数的内容。可能吗 我想要实现以下目标: #!/bin/bash OUT=/tmp/outfile.txt IN=/my_in_file.txt sed $IN &lt;&lt; SED_SCRIPT s/a/1/g s/test/full/g SED_SCRIPT &gt; $OUT; 任何帮助都非常感谢。

1
如何使用cat将变量回显到文件中?
我有这样的简单脚本: #!/bin/bash BOO=bla-bla-bla cat &gt; ./Makefile &lt;&lt;'EOF' Hello INCLUDES := -I/data/opt/include/ -Ideps/ -I$BOO/include EOF 但是它输出到文件中: Hello INCLUDES := -I/data/opt/include/ -Ideps/ -I$BOO/include 如何cat使用我的变量值,而不是该字符串中的名称?

2
将变量传递给使用'EOF'的bash脚本,并将该变量视为文字。
已关闭。这个问题需要细节或说明。它当前不接受答案。 想改善这个问题吗?添加详细信息并通过编辑此帖子来澄清问题。 5年前关闭。 在此脚本中,我最终将“ $ 1”保存到/ test文件中。 #!/bin/bash cat &gt; /test &lt;&lt; 'EOF' $1 EOF 事实是..我需要保持 'EOF' 为'EOF',因为我的论点($ 1)包含美元符号。 但我需要保存该参数而不是保存$ 1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.