标签: here-document

此处缩进的文档会导致语法错误

我的 shell 脚本中有以下代码片段,并且有一个错误,尽管进行了一些研究,但我似乎无法确定原因。当我运行如下代码时,脚本退出并显示一条消息

./my_script.sh:  line 53: syntax error at line 61: `<<' unmatched
Run Code Online (Sandbox Code Playgroud)

我已经使用过set -x并且可以看到在出现错误之前一切都很好(无论如何我只设置了变量)。出于某种原因,只需从eot允许它工作之前删除空格(它们是空格而不是非显示字符)。它让我的 xml 看起来有点不对齐但功能正常。有谁知道为什么会发生这种情况,因为我不喜欢这样的事情,我无法解释,我希望我的 xml 看起来也很漂亮。

这是脚本的相关部分:

# ... various environment variables set here ...

clean_files()          # line 53
{
    # Clear up the intermediate files
    mv $datafile $ARCHIVE_DIR/$(basename $datafile).$$
}

xmlfile_header()
{                      # line 60
        cat <<- eot
                <?xml version="1.0" encoding="UTF-8" ?>
                <ppllist>
        eot  
}

# ... more stuff ...
Run Code Online (Sandbox Code Playgroud)

ksh shell-script whitespace here-document

3
推荐指数
1
解决办法
847
查看次数

字符串和文件之间的差异

基本上我想检查前后相同文件的差异 sed

试图运行:

diff /opt/postTrades.sh <<< $(sed 's/1\ MIN/10\ MIN/g' /opt/postTrades.sh)
Run Code Online (Sandbox Code Playgroud)

diff <<< $(sed 's/1\ MIN/10\ MIN/g' /opt/postTrades.sh) < /opt/postTrades.sh 
Run Code Online (Sandbox Code Playgroud)

diff <<< (sed 's/1\ MIN/10\ MIN/g' /opt/postTrades.sh) < /opt/postTrades.sh
Run Code Online (Sandbox Code Playgroud)

总是得到:

diff: missing operand after '/opt/postTrades.sh'
diff: Try 'diff --help' for more information.
Run Code Online (Sandbox Code Playgroud)

正确的做法是什么?谢谢。

diff here-document here-string

3
推荐指数
1
解决办法
1950
查看次数

管道生产者如何告诉管道消费者它已到达“文件结尾”?”(未命名管道,而不是命名管道)

我有一个应用程序,它要求生产者将文件名发送给消费者,并让生产者在发送最后一个文件名并到达文件末尾时向消费者指示。

为简单起见,在以下示例中, 使用和演示生产者,而使用 演示消费者。我试图推断“此处文件”方法但没有成功,用于向生产者包装器(如果存在此类东西)指示要查找的内容作为文件结尾的指示。如果它工作应该从输出中过滤。echoprintfcat<<EOFcatEOF

例 1)

输入

{
echo "Hello World!" 
printf '\x04' 
echo "EOF"
} <<EOF |\
cat
Run Code Online (Sandbox Code Playgroud)

输出

bash: warning: here-document at line 146 delimited by end-of-file (wanted `EOF')
Hello World!
EOF
Run Code Online (Sandbox Code Playgroud)

例 2)

输入

{ 
echo "Hello World!" 
printf '\x04' 
echo "EOF"
} |\
cat <<EOF
Run Code Online (Sandbox Code Playgroud)

输出

bash: warning: here-document at line 153 delimited by …
Run Code Online (Sandbox Code Playgroud)

pipe here-document here-string

3
推荐指数
1
解决办法
3276
查看次数

如何通过 bash 中的 heredoc 运行补丁?

我正在尝试在 bash 中修补这样的文件:

cat << ''EOF | patch --dry-run
> --- urancid     2017-12-06 09:56:33.000000000 -0600  patch --dry-run
> +++ /tmp/urancid        2017-12-06 15:06:57.000000000 -0600
> @@ -393,7 +393,7 @@
>          last if (/^$prompt/);
>          next if (/-ac\.\s*/);
>          next if (/-fs\.\s*/);
> -       next if (/set date\s*/)
> +       next if (/set date\s*/);
>          next if (/^(\s*|\s*$cmd\s*)$/);
>          if ( ! /^$prompt/) {
>                  if ( ! $skipprocess ) {
> EOF
Run Code Online (Sandbox Code Playgroud)

但我得到的只是

patching file urancid
Hunk #1 FAILED at 393. …
Run Code Online (Sandbox Code Playgroud)

patch here-document

3
推荐指数
1
解决办法
2113
查看次数

如何从heredoc重定向到文件

我有这个:

cat <<EOF

'use strict';

exports.default = {

  'display names': {}

}

EOF >  "$PWD/tmp.js"
Run Code Online (Sandbox Code Playgroud)

但这显然在语法上是错误的,有人知道这样做的语法吗?

bash shell-script here-document

3
推荐指数
1
解决办法
619
查看次数

Bash 脚本:包含“$”字符的文件中的多行 Cat

我正在做一个脚本来自动安装一些东西,包括一个 nginx web 服务器。

我正在创建这样的 nginx conf 文件:

cat >/etc/nginx/sites-available/bookstack.conf <<EOL
server {
  listen 443 ssl;
  listen [::]:443 ssl;
  ssl_certificate /etc/nginx/certificats/domain.tld.crt;
  ssl_certificate_key /etc/nginx/certificats/domain.tld.key;
  ssl_protocols TLSv1.2 TLSv1.1 TLSv1;

  server_name domain.tld;

  root /path/to/bookstack/public;

  index index.php index.html;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  location ~ \.php$ {
    fastcgi_index index.php;
    try_files $uri =404;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
  }
}

server {
    listen 80;
    listen [::]:80;

    server_name domain.tld;

    return 302 https://$server_name$request_uri;
}

EOL
Run Code Online (Sandbox Code Playgroud)

我的问题是 cat 将 $ 字符作为变量名(这通常是有意义的)并且没有将我想要的内容放入我的.conf文件中。这是脚本完成工作后我的 …

bash shell-script cat here-document variable

3
推荐指数
1
解决办法
45
查看次数

使用 HEREDOC 的 OPENSSL 自动应答密码

我有以下命令,但它对我不起作用...

cd /etc/postfix/ssl/ && openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024 <<PASS
password
password
PASS
Run Code Online (Sandbox Code Playgroud)

输出是:

109 semi-random bytes loaded
Generating RSA private key, 1024 bit long modulus
...............................++++++
...........++++++
e is 65537 (0x10001)
Enter pass phrase for smtpd.key:
Run Code Online (Sandbox Code Playgroud)

它应该自动回答问题并自动输入密码。

我总是HEREDOC用于在 bash 上自动化我的问答并且工作正常......

这里有什么问题?

可能是因为安全问题,但是我们如何处理这样的问题呢?

我也知道这个问题,但无法解决。

我正在尝试这个:(没有结果)

#!/bin/bash
PASS="password"
printf '%s\n' "$PASS" | {
    openssl genrsa -des3 -rand /etc/hosts -out smtpd.key 1024 -passout fd:3
} 3<&0
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

linux bash here-document

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

awk - 从标准输入读取程序和输入?

awk 是否可以从标准输入读取程序和输入?

我希望能够将文件通过管道传输到以下函数。

process_data () {
  awk -f - <<EOF
{print}
EOF
}
Run Code Online (Sandbox Code Playgroud)

注意:实际程序较长,不能作为命令行参数传递,我宁愿不使用临时文件。

目前它不输出任何东西。

$ yes | head | process_data 
$ 
Run Code Online (Sandbox Code Playgroud)

shell io-redirection awk here-document

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

使用 EOF 发送变量并使用宿主变量

我想将变量从源发送到主机,然后执行主机脚本。这是我的代码:

var1=1
ssh -p 42 root@xxx /bin/bash << EOF
  var2=2
  echo $var1
  echo $var2
EOF
Run Code Online (Sandbox Code Playgroud)

返回 : 1

var1=1
ssh -p 42 root@xxx /bin/bash << \EOF
  var2=2
  echo $var1
  echo $var2
EOF
Run Code Online (Sandbox Code Playgroud)

返回 : 2

如何返回:

1
2
Run Code Online (Sandbox Code Playgroud)

?

shell ssh quoting here-document variable

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

使用heredoc或其他技术创建单个字符串参数

我正在尝试在远程服务器上执行脚本,并将脚本作为最后一个参数传递

ntrs exec-all-ubuntu --exec `cat << 'EOF'

  echo "$(pwd)"
  echo "$foobar"

EOF`
Run Code Online (Sandbox Code Playgroud)

问题是文本中的值作为单独的参数发送,echo 是第一个参数,pwd 值是第二个单独的参数,但我只想要一个参数作为字符串

参数最终看起来像这样:

[ '--exec', 'echo', '"$(pwd)"', 'echo', '"$foobar"' ]
Run Code Online (Sandbox Code Playgroud)

但我正在寻找带有换行符的字面内容:

[ '--exec', '   echo "$(pwd)"\n\n echo "$foobar"\n ' ]
Run Code Online (Sandbox Code Playgroud)

我也尝试使用这个:

ntrs exec-all-ubuntu --exec `read -d << EOF
    select c1, c2 from foo
    where c1='something'
EOF`
Run Code Online (Sandbox Code Playgroud)

但该字符串是空的

shell bash cat here-document

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