我有一个可以在Ubuntu上运行的shell脚本,并根据需要为我提供输出。当我在slackware linux版本上测试相同内容时,我的脚本失败了。
脚本失败:
dialog --title "Test" --gauge "Copying file." 6 100 < <(
rsync -a --progress test.tar.gz /media/sda1 |
unbuffer -p grep -o "[0-9]*%" |
unbuffer -p cut -f1 -d '%'
)
错误是:
Syntax error near unexpected token `<'
脚本无法执行的两个操作系统之间可能有什么不同? 如果我删除了对话框命令和括号等,脚本会成功执行。
答案 0 :(得分:2)
最有可能的是,您正在尝试使用非bash shell运行bash脚本。或者使用较旧的bash版本。
首先,尝试明确地通过bash运行它,即:
bash script.sh
你也应该修理你的shebang指向bash:
#!/bin/bash
答案 1 :(得分:1)
[更新如下]
< <( ... )
符号在bash
和zsh
中是唯一的。语法错误是一个明显的标志,它无法被slackware shell识别。
slackware不使用bash,或者它的bash版本对于此功能来说太旧了。 检查两个平台上$ BASH_VERSION的值。
的可能替代方案
cat < <(
...
...
)
可能是:
cat <<< "$(
...
...
)"
这可以在bash,ksh93和zsh中使用,并且已经存在了一段时间。
更新
根据您的反馈,我查看了您尝试在此处使用的实际管道。
我相信您打算使用--progress
输出的第3列作为对话框图形进度指示器的输入。
我尝试使用包含大量小文件的目录。您是否知道此百分比指标是每个文件?使用我的小文件,rsync每个文件只提供一次更新。由于每个文件都是一次性编写的,因此所有百分比都等于100%
。