标签: here-document

如何将输出重定向与 here-documents 和 cat 结合使用?

假设我有一个脚本,我想通过管道传输到另一个命令或重定向到一个文件(sh示例中通过管道传输到该文件)。假设我正在使用 bash。

我可以使用echo

echo "touch somefile
echo foo > somefile" | sh
Run Code Online (Sandbox Code Playgroud)

我也可以使用cat以下方法做几乎相同的事情:

cat << EOF
touch somefile
echo foo > somefile
EOF
Run Code Online (Sandbox Code Playgroud)

但是如果我用“EOF | sh”替换“EOF”,它只会认为它是heredoc的一部分。

我怎样才能使它cat从标准输入输出文本,然后将其通过管道传输到任意位置?

shell io-redirection cat here-document

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

无法缩进 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 process.
EOI

else
        echo "$diffLines have changed"
fi
Run Code Online (Sandbox Code Playgroud)

该脚本发送电子邮件没有问题,但 mailx 命令嵌套在 if 语句中,因此我似乎有两个选择:

  1. EOI一个新的生产线,打破花纹或
  2. 保持缩进,但使用类似 echo 语句的东西让 mailx 接收我的电子邮件。

我对heredoc的替代品持开放态度,但如果有办法解决这个问题,这是我的首选语法。

shell bash shell-script here-document

92
推荐指数
3
解决办法
4万
查看次数

在heredoc中传递和设置变量

我有一个脚本,它必须在许多不同的远程机器上做许多不同的事情。我认为 heredoc 会为此工作,但我无法使用脚本中其他地方定义的变量heredoc 中定义的变量。

这是一些代码:

#!/bin/sh

FOO="foo"
ssh some.remote.host << EOF
  BAR="bar"
  echo "FOO=$FOO"
  echo "BAR=$BAR"
EOF
Run Code Online (Sandbox Code Playgroud)

这仅打印以下内容:

FOO=

酒吧=酒吧

但是,如果我像这样引用 EOF 行: ssh some.remote.host << "EOF" 那么它只打印以下内容:

富=富

酒吧=

关于如何在 heredoc 中使用这两个变量的任何提示?

谢谢。

shell-script here-document

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

如何输出包含斜杠和其他特殊字符的多行字符串?

我想在 bash 脚本完成后输出它。

 /\_/\
( o.o )
 > ^ <
Run Code Online (Sandbox Code Playgroud)

我已尝试以下但所有返回错误。

echo /\\_/\\\n\( o.o \)\n > ^ <
echo  \/\\_\/\\\r\n( o.o )\r\n > ^ <
echo /\\_/\\\n\( o.o \)\n \> ^ <
Run Code Online (Sandbox Code Playgroud)

如何转义这些字符以便 bash 将它们呈现为字符串?

bash shell-script echo escape-characters here-document

23
推荐指数
2
解决办法
7977
查看次数

POSIX 在命令替换中引用此处的文档需要什么?

如何将 HEREDOC 文本带入 shell 脚本变量中?有人报告了一个问题,使用here 文档$(...)命令替换内使用带引号的分隔符,其中\文档内行尾的反斜杠触发换行符连接行继续,而命令替换的相同 here 文档按预期工作。

这是一个简化的示例文档:

cat <<'EOT'
abc ` def
ghi \
jkl
EOT
Run Code Online (Sandbox Code Playgroud)

这包括一行末尾的一个反引号和一个反斜杠。分隔符被引用,因此正文内部不会发生扩展。在所有 Bourne-alikes 中,我可以找到逐字输出内容。如果我将相同的文档放在命令替换中,如下所示:

x=$(cat <<'EOT'
abc ` def
ghi \
jkl
EOT
)
echo "$x"
Run Code Online (Sandbox Code Playgroud)

那么它们的行为不再相同:

  • dashashzshksh93、 BusyBox ashmksh和 SunOS 5.10 POSIXsh都像以前一样给出了文档的逐字内容。
  • Bash 3.2 给出了一个不匹配的反引号的语法错误。使用匹配的反引号,它尝试将内容作为命令运行。
  • Bash 4.3 将“ghi”和“jkl”折叠成一行,但没有错误。该--posix选项不影响此。Kusalananda告诉我(谢谢!)它的pdksh行为方式相同

在最初的问题中,我说这是 Bash …

shell-script posix command-substitution here-document

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

如何在新的 tmux 会话中执行代码 - 从当前会话中?

我使用 Ubuntu 16.04,我需要以下tmux解决方案,因为我想运行超时过程,sleep因为在我的特定情况下,我不满意at并遇到了错误nohup(组合时nohup-sleep)。现在,它tmux似乎是最好的选择,因为它有自己的无挂断机制,并且在手动使用中实际上工作正常(我只问关于自动化我已经可以手动使用它的过程的问题)。

我需要的:

我需要一种方法来执行以下 3 个操作,全部在一个操作中:

  1. 附加一个新tmux会话。
  2. 向该会话注入一组现成的命令,例如(sleep 30m ; rm -rf dir_name ; exit). 我特别喜欢多行设置,而不是一排长排。
  3. 执行上面的命令设置完成的那一刻在新tmux会话中写入为标准输入。

换句话说,我想在另一个tmux专门为该原因创建的会话中执行代码集,但要在一个操作中完成所有操作。


笔记:

  • 我的目标是在我最初的工作会议(我大部分时间工作的那个会议)中完成所有工作。通常,我无意访问新创建的会话,我只想使用其自动执行的代码创建它,仅此而已。

  • 如果可能,我更喜欢 heredoc 解决方案。我认为这是最有效的。

tmux timeout here-document

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

是否可以在 bash 中使用多个 here-docs?

可以使用多个 here-docs 为 bash 中的命令提供输入吗?

$ cat <<<foo <<<bar
bar
$ cat <<EOF1 <<EOF2
> foo
> EOF1
> bar
> EOF2
bar
Run Code Online (Sandbox Code Playgroud)

显然,在这两种情况下,第二个 here-doc 都用作标准输入,并替换了第一个引用。是使用echos的解决方案吗?

$ cat <(echo -n foo) <(echo bar)
foobar
Run Code Online (Sandbox Code Playgroud)

此外,出于某种原因,使用组合对我不起作用。为什么会这样?

$ cat <<<foo <(echo bar)
bar
$ cat <(echo -n foo) <<<bar
foo
Run Code Online (Sandbox Code Playgroud)

bash io-redirection here-document

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

bash 脚本错误 stty:标准输入:设备的 ioctl 不合适

我在 bash 脚本中使用 here-documents 来自动安装和设置,其中多次需要密码。我输入密码一次,脚本将其传递给各种命令。在大多数情况下,here-document 方法可以很好地处理这个问题。但是,在一种情况下,我收到此错误:

Enter VNC password: stty: standard input: Inappropriate ioctl for device
Verify password:    
stty: standard input: Inappropriate ioctl for device
Run Code Online (Sandbox Code Playgroud)

请注意,此错误消息来自x11vnc -storepassword(而非来自sudo.)

我的问题x11vnc -storepasswd与这里有关,这是我的代码:

sudo x11vnc -storepasswd ~/.vnc/passwd << ENDDOC
password
password
y
ENDDOC
Run Code Online (Sandbox Code Playgroud)

这显然(来自错误)不起作用。我很感激如何sudo x11vnc -storepasswd ~/.vnc/passwd在脚本中实现的工作示例。

如果有帮助,提示如下所示:

输入 VNC 密码:
验证密码:
将密码写入 /home/user/.vnc/passwd? [年]/年

使用expect会是更好的解决方案吗?如果是这样,在这种情况下我将如何使用它?(我以前从未使用expect过,但自从发布这个问题以来我看过很多例子,我无法自己expect开始工作。)

bash shell-script expect here-document

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

如何将 Bash 的进程替换与 HERE 文档结合起来?

在 Bash 版本 4.2.47(1)-release 中,当我尝试连接来自 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.
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

bash: bad substitution: no closing `)' in <(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
)
Run Code Online (Sandbox Code Playgroud)

此外,我不想引用 HERE …

bash process-substitution here-document

16
推荐指数
2
解决办法
4434
查看次数

为什么来自 heredoc 的 JSON 内容无法解析?

我有一个 JSON 片段。

以下不起作用:

VALUE=<<PERSON
{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "jim@gmail.com"  
}
PERSON
echo -n "$VALUE" | python -m json.tool
Run Code Online (Sandbox Code Playgroud)

结果是:

无法解码 JSON 对象

做同样的事情jq,即

echo -n "$VALUE" | jq '.'
Run Code Online (Sandbox Code Playgroud)

没有输出。

以下行为具有相同的行为:

VALUE=<<PERSON
'{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "jim@gmail.com"  
}'
PERSON
echo -n "$VALUE" | python -m json.tool
Run Code Online (Sandbox Code Playgroud)

回复:

无法解码 JSON 对象

但以下工作:

VALUE='{
  "type": "account",
  "customer_id": "1234",
  "customer_email": "jim@gmail.com"
}'
echo -n "$VALUE" | jq '.'
echo -n "$VALUE" | python -m json.tool
Run Code Online (Sandbox Code Playgroud)

shell here-document variable json

15
推荐指数
3
解决办法
5726
查看次数