bash脚本,管道命令中的文件输入

时间:2016-02-19 01:02:13

标签: bash shell command-line

我在运行El Capitan的Mac PowerBook上登录时获得了以下别名,OS X 10.11.3安装了Developer Tools安装和命令行实用程序:

alias prt_2up="enscript -G -p - \$@ | quarto -2 | lpr -P $PRINTER"

请注意$PRINTER.bashrc中定义为:

export PRINTER=EPSON_Stylus_CX4800___barsoom

我“用”将其用作:

prt_2up file.txt

它创建了一个打印输出,每个打印页面有2页没有问题。

现在,我收到以下错误:

19:54:50 1z [woo:~] > source .bashrc
19:54:54 1z [woo:~] > echo $PRINTER
EPSON_Stylus_CX4800___barsoom
19:54:59 1z [woo:~] > prt_2up test.php
enscript: couldn't open input file "noclobber": No such file or directory
no output generated
lpr: The printer or class does not exist.

不明白为什么$PRINTER不存在以及输入文件“no clobber”是什么。顺便说一句,我已经完成了+ o no clobber。无论我是打开还是关闭都没关系。四重奏是另一个实用程序,允许将一页以上的页面放在一张纸上。 noclobber来自哪里?

我也尝试使用$@而不使用前导\。没有快乐。

建议表示赞赏。

1 个答案:

答案 0 :(得分:1)

我不能告诉你为什么它以前有用,但我肯定看到了一个问题。在我详细介绍之前,我建议你试试这个:

prt_2up () { enscript -G -p - "$@" | quarto -2 | lpr -P "$PRINTER"; }

我看到的问题是在别名中使用$@而不是shell函数。请看以下内容:

$ set -xv
$ alias foo="echo \$@"
alias foo="echo \$@"
+ alias 'foo=echo $@'
$ foo a b
foo a b
+ echo a b
a b
$ alias bar="echo \$@ | cat"
alias bar="echo \$@ | cat"
+ alias 'bar=echo $@ | cat'
$ bar a b
bar a b
+ echo
+ cat a b
cat: a: No such file or directory
cat: b: No such file or directory
$ baz () { echo "$@" | cat; }
baz () { echo "$@" | cat; }
$ baz a b
baz a b
+ baz a b
+ echo a b
+ cat
a b

bar别名与baz shell函数的作用不同,foo也不行。

$ set 1 2 3
set 1 2 3
+ set 1 2 3
$ echo "$@"
echo "$@"
+ echo 1 2 3
1 2 3
$ alias foo
alias foo
+ alias foo
alias foo='echo $@'
$ foo a b
foo a b
+ echo 1 2 3 a b
1 2 3 a b

别名中的$@引用shell本身的参数,而shell函数中的$@引用该函数的参数。