【问题标题】:sh: syntax error near unexpected token `<'sh:意外标记“<”附近的语法错误
【发布时间】:2020-10-20 07:15:10
【问题描述】:

我正在创建一个脚本,我将 awk 命令的输出重定向到一个循环中,但它给了我这个错误:

sh: -c: line 3: syntax error near unexpected token `<'
sh: -c: line 3: `done < <(awk "{print}" inputfile.txt)'

我能够在不同的远程主机上运行它,但是这个主机给了我一个错误。有谁知道某些版本的 sh/bash 是否不支持该语法,或者知道该语法的任何替代方案,或者可能发现了我无法看到的错误? (我是 bash 脚本的新手,所以即使是正确的方向也会有所帮助!)

这是我能够重现该问题的脚本的精简版本:

#!/usr/bin/env bash

host=$1

ssh $host 'while read line
do
echo "hi";
done < <(awk "{print}" inputfile.txt)'

【问题讨论】:

  • 您是否使用sh scriptname 运行脚本?
  • 我正在使用bash scriptname 运行它,尽管使用 bash 或 sh 运行它时出现错误
  • @Kaitlyn :从错误消息中,您可以看到产生错误消息的不是 bash,因为使用 bash,消息将是 bash : bla bla.,而不是 sh : ....

标签: bash ssh sh


【解决方案1】:

看起来该主机上的远程用户使用不是 Bash 的 shell 来运行命令,请参阅 this Q&A;一种解决方法是避免 Bashisms:

ssh "$host" 'awk "{print}" inputfile.txt \
    | while IFS= read -r line; do
        echo "$line"
    done'

它有自己的缺陷,请参阅A variable modified inside a while loop is not remembered - 或者,您可以指定远程主机应该运行 Bash:

ssh "$host" <<'EOF'
bash -c 'while IFS= read -r line; do
    echo "$line"
done < <(awk "{print}" inputfile.txt)'
EOF

【讨论】:

  • 好的,这个解释很有道理,谢谢。不幸的是,在远程主机上指定 bash 的第二个 sn-p 似乎不起作用。这很奇怪,因为我可以看到远程服务器上安装了 bash,但我猜它不会使用 bash?我将尝试像您的第一个示例一样修改“bashisms”。
  • 在开始时将我的 awk 结果通过管道传输到 while 循环。感谢您的帮助!
猜你喜欢
  • 2022-11-13
  • 2012-08-31
  • 2012-10-20
  • 2012-09-29
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2014-09-01
相关资源
最近更新 更多