AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题

问题[here-document](unix)

Martin Hope
Erwann
Asked: 2023-04-06 05:15:54 +0800 CST

如何将脚本文件作为 heredoc 传递给 sed?

  • 5

这会将“a”转换为“A”。

sed 's/a/A/g' <(echo "foobar")
foobAr

这提供了使每个元音大写所需的命令:

$ cat << EOF
s/a/A/g
s/e/E/g
s/i/I/g
s/o/O/g
s/u/U/g
EOF

我想做的是扩展第一个示例,以便将每个元音字母大写,并使用此处的文档,如第二个示例所示。有什么建议吗?

男人:

sed [OPTION]... {script-only-if-no-other-script} [输入文件]...

-f script-file, --file=script-file 将script-file的内容添加到要执行的命令中

here-document
  • 2 个回答
  • 20 Views
Martin Hope
thinksinbinary
Asked: 2023-02-13 11:19:08 +0800 CST

什么时候有人会选择使用限制字符串 (<<-) 而不是使用 <<< 的正常方式在此处格式化字符串?

  • 5

The - option to mark a here document limit string (<<-LimitString) will suppress leading tabs (but not spaces) in the output.

我想知道的是为什么有人在使用“此处”方法处理命令时想要删除前导选项卡。是关于输出的可读性,还是关于如果我们想将输出传递给其他东西时清理输出?

here-document
  • 1 个回答
  • 32 Views
Martin Hope
Erwann
Asked: 2022-03-19 20:20:36 +0800 CST

使用 heredoc 遍历命令列表

  • 0

这工作正常:

$ eval 'echo "1" > ~/Desktop/in/foo'

但不是这个:

$ while IFS= read _cmd; do eval "$_cmd"; done < <(cat << EOF
'echo "1" > ~/Desktop/in/foo'
'echo "2" > ~/Desktop/in/bar'
EOF
)
bash: echo "1" > ~/Desktop/in/foo: No such file or directory
bash: echo "2" > ~/Desktop/in/bar: No such file or directory

如何解决?


更新

正如建议的那样,删除单引号是可行的,但不适用于这种变体(同上,仅用单引号将文件名括起来):

$ while IFS= read _cmd; do eval "$_cmd"; done < <(cat << EOF 
echo "1" > ~/Desktop/in/foo (bis)
echo "2" > ~/Desktop/in/bar
EOF
)

连同提供的解决方案:

"$SHELL" << EOF
echo "1" > ~/Desktop/in/'foo (bis)'
echo "2" > ~/Desktop/in/bar
EOF
here-document eval
  • 1 个回答
  • 66 Views
Martin Hope
RonJohn
Asked: 2021-12-06 08:45:09 +0800 CST

ssh、heredoc 和环境变量

  • -1
这个问题在这里已经有了答案:
在 heredoc 中传递和设置变量 1 个答案
10 个月前关闭。

(这是 RHEL 8.4,如果重要的话。)

该echo脚本中第 5 行和第 7 行的命令在本地主机上运行,​​但第hostname6 行和第 8 行的命令按预期在远程主机上运行。

为什么第 5 行和第 7 行在本地主机上运行?更重要的是,如何让它们在远程主机上运行?

编辑:我不想传递变量。我希望在远程服务器上单独定义和使用变量。

 1 #!/bin/bash
 2 export foo=bar
 3 ssh -q ${1} <<EOF
 4     export foo=blarge
 5     echo $foo
 6     hostname
 7     echo $foo
 8     hostname
 9 EOF
10 hostname
shell-script here-document
  • 1 个回答
  • 347 Views
Martin Hope
user001
Asked: 2019-08-06 16:50:47 +0800 CST

保留 heredocs 中的反斜杠换行符在子 shell 中运行

  • 2

只要不存在终端反斜杠,在变量中捕获heredoc的输出后,就会保留heredoc的换行符:

var=$(cat <<-EOF
a
b
c
EOF
)
echo "$var"

a
b
c

但是,当尝试存储反斜杠换行符时,换行符会丢失:

var=$(cat <<-EOF
a \\
b \\
c
EOF
)

echo "$var"
a \b \c

添加额外的反斜杠以进一步转义并没有帮助。

当然,当不在子shell中运行时,可以使用heredoc生成以反斜杠换行符结尾的行:

$ cat <<-EOF
a \\
b \\
c
EOF
a \
b \
c

为了避免这个问题,可以添加一个换行符来通过变量的转换来生成所需的输出:

var=$(cat <<-EOF
a \\@
b \\@
c
EOF
)

tr -d '@' <<<"$var"

a \
b \
c

有没有更直接的方法来保留在子外壳中运行的 heredocs 中的反斜杠换行符?

bash here-document
  • 2 个回答
  • 3824 Views
Martin Hope
lamplet
Asked: 2019-07-15 23:53:39 +0800 CST

此命令 tee <<-'EOF' 中使用的连字符 (‐) 是什么?[复制]

  • -1
这个问题在这里已经有了答案:
<<-EOC 是什么意思? (2 个回答)
如何以正确的方式在heredoc中缩进heredoc? (2 个回答)
3年前关闭。

我看到了以下命令:

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"]
}
EOF

连字符 (‐) 是做什么用的?即使我删除连字符,它也能正常工作。

here-document
  • 1 个回答
  • 1180 Views
Martin Hope
Drew
Asked: 2019-02-03 20:11:36 +0800 CST

停止 CTRL+C 退出在远程机器上运行 tcpdump 的本地脚本

  • 2

我已经设置了一个简单的脚本,如下所示:

sshpass -p $password ssh -T $username@$ip_address -p 30007 <<- EOF > $save_file.pcap
    sh
    tcpdump -i eth5.1 -s 0 -n -v -U -w -
EOF

sed -i '1d' $save_file.pcap

该脚本的目的是让我可以在远程设备上运行 tcpdump,同时将输出保存到本地计算机上的文件中(远程设备的存储容量非常有限,因此这将允许我获得大量捕获,当然,还可以让我更快地按需设置捕获)。

和 heredoc的目的sh是因为默认情况下,我不会被放入此远程设备的适当外壳中。在远程设备中发出sh让我能够运行我的 tcpdump 的正确 shell,而这个 heredoc 是我发现完成此任务并且仍然将信息移植回我的本地文件的唯一方法。

我遇到的问题是,一旦脚本到达该脚本的 tcpdump 部分,我的终端就会得到如下输出,就像我在将 tcpdump 运行到文件时所期望的那样:

drew@drew-Ubuntu-18:~/Desktop$ ./Script.sh 
tcpdump: listening on eth5.1, link-type EN10MB (Ethernet), capture size 65535 bytes
Got 665

当然,随着越来越多的数据包被捕获并通过管道传输到我的本地文件中,“Got”计数器也会增加。不幸的是,到目前为止,我发现停止此操作并返回终端的唯一方法是启动CTRL+ C。

这里的问题是,这不仅会停止远程机器上的 tcpdump,还会结束在我的本地机器上运行的脚本。

这当然意味着我的脚本中没有任何进一步的运行,并且除了sed我在这里包含的数据之外,我还需要使用这些数据执行许多任务。

我试图改为设置如下:

tcpdump -i eth5.1 -s 0 -n -v -U -w - &
read -n 1 -s; kill $!

这里的思考过程是我的原始 tcpdump 信息仍将发布到标准输出,因此仍将填充到我的本地捕获文件中。但是,似乎当我尝试以这种方式运行捕获时&,它实际上并没有让我在终端中发布任何其他内容(不确定是否总是有太多的垃圾飞行或什么)。我什至在本地尝试过,似乎尝试将原始 tcpdump 发布到标准输出并不会让其他任何事情发生。

基于这些信息,此时我唯一能想到的就是我是否可以使用某种方式使用CTRL+C来关闭远程计算机上的 tcpdump,但保持我的脚本仍在运行。我可以尝试任何建议吗?或者其他更合乎逻辑的方法?

tcpdump here-document
  • 1 个回答
  • 1537 Views
Martin Hope
Alexander Mills
Asked: 2018-12-22 18:32:39 +0800 CST

END 和 EOF 的区别

  • 2

有什么区别:

cat <<END
    {"@json-stdio":true,"value":"$pack"}
END

和

cat <<EOF
    {"@json-stdio":true,"value":"$pack"}
EOF

?

bash here-document
  • 1 个回答
  • 967 Views
Martin Hope
ka3ak
Asked: 2018-11-25 23:45:34 +0800 CST

我可以使用 << EOF 但让用户完成输入吗

  • 1

对此的需要来自下面的脚本。它使用 anyconnect 的 vpn 实用程序连接到远程 PC。首先,它要求输入一次性密码,连接,启动 RDP 客户端,并在 RPD 客户端应用程序关闭后断开连接。

if [ $# == 1 ]; then
    ONE_TIME_PWD=$1;
else
    printf "Enter the one-time password: ";
    read ONE_TIME_PWD;
fi

vpn -s connect <domain> << EOF
<user>
<pin>$ONE_TIME_PWD
EOF

# Use some RDP client here like xfreerdp or rdesktop

vpn -s disconnect <domain>

问题是一次性密码在执行过程中可能会改变vpn -s connect <domain>。<pin>所以我很好奇是否可以更改脚本,以便它让我在自动插入后输入一次性密码?我已经尝试head -c -1删除最后一个换行符,但输入仍然完成。不基于 EOF 的任何其他解决方案都是可以接受的。

bash here-document
  • 2 个回答
  • 191 Views
Martin Hope
user9303970
Asked: 2018-06-17 10:45:52 +0800 CST

没有定界符的文档

  • -1

在这篇文章中,斯蒂芬的回答显示了这段代码:

cat <<-"EOF1" >> myPath/myFile.append
if ! grep -F -q -f myPath/myFile{.append,}; then
    cat myPath/myFile.append >> myPath/myFile
fi

为什么这里的文档没有分隔符?

bash here-document
  • 1 个回答
  • 93 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve