1

我有一个可以在 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 `<'

脚本无法执行的两个操作系统之间可能有什么不同?如果我摆脱对话框命令和括号等,脚本将成功执行。

4

2 回答 2

2

很可能,您正在尝试使用非 bash shell 运行 bash 脚本。或者使用较旧的 bash 版本。

首先,尝试通过 bash 显式运行它,即:

bash script.sh

您还应该修复您的 shebang 指向 bash:

#!/bin/bash
于 2012-08-22T20:28:32.203 回答
1

[以下更新]

< <( ... )符号对于bash和是唯一的zsh。语法错误是 slackware shell 无法识别的明显标志。

要么 slackware 不使用 bash,要么它的 bash 版本对于这个特性来说太旧了。检查两个平台上 $BASH_VERSION 的值。

一个可能的替代方案

cat < <(
    ...
    ...
)

可能:

cat <<< "$(
    ...
    ...
)"

这将在 bash、ksh93 和 zsh 中工作,并且存在的时间稍长。

更新

根据您的反馈,我查看了您在此处尝试使用的实际管道。我相信您打算将--progress输出的第 3 列用作对话框图形进度指示器的输入。

我尝试了一个包含很多小文件的目录。您是否知道此百分比指标是针对每个文件的?对于我的小文件,rsync 每个文件只提供一个更新。由于每个文件都是一次性写入的,因此所有百分比都等于100%.

于 2012-08-22T21:40:11.267 回答