假设我有一个脚本,我想通过管道传输到另一个命令或重定向到一个文件(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从标准输入输出文本,然后将其通过管道传输到任意位置?
如果脚本编写存在“第一世界问题”,那就是它。
我正在更新的脚本中有以下代码:
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 语句中,因此我似乎有两个选择:
EOI一个新的生产线,打破花纹或我对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 中使用这两个变量的任何提示?
谢谢。
我想在 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 将它们呈现为字符串?
在如何将 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)
那么它们的行为不再相同:
dash、ash、zsh、ksh93、 BusyBox ash、mksh和 SunOS 5.10 POSIXsh都像以前一样给出了文档的逐字内容。--posix选项不影响此。Kusalananda告诉我(谢谢!)它的pdksh行为方式相同。在最初的问题中,我说这是 Bash …
我使用 Ubuntu 16.04,我需要以下tmux解决方案,因为我想运行超时过程,sleep因为在我的特定情况下,我不满意at并遇到了错误nohup(组合时nohup-sleep)。现在,它tmux似乎是最好的选择,因为它有自己的无挂断机制,并且在手动使用中实际上工作正常(我只问关于自动化我已经可以手动使用它的过程的问题)。
我需要一种方法来执行以下 3 个操作,全部在一个操作中:
tmux会话。(sleep 30m ; rm -rf dir_name ; exit). 我特别喜欢多行设置,而不是一排长排。tmux会话中写入为标准输入。换句话说,我想在另一个tmux专门为该原因创建的会话中执行代码集,但要在一个操作中完成所有操作。
我的目标是在我最初的工作会议(我大部分时间工作的那个会议)中完成所有工作。通常,我无意访问新创建的会话,我只想使用其自动执行的代码创建它,仅此而已。
如果可能,我更喜欢 heredoc 解决方案。我认为这是最有效的。
可以使用多个 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 脚本中使用 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 版本 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 …
我有一个 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)