2010-11-12 109 views
2

我试图通过从文本文件中读取命令来运行命令,但失败了。当我输入完全相同的行时,它很难。即时通讯惊讶,它甚至尝试执行移动命令,但得到了一个错误消息,转换为“文件或目录未找到”。显然,这里的错误消息并没有说出真相。有人可以解释吗?错误地使用反引号执行?

[email protected]:~/spr/man/de$ head -n7 mkdoc|tail -n1 
mv nutzer.1.gz ~/public_html/man/man1/ 
[email protected]:~/spr/man/de$ `head -n7 mkdoc|tail -n1` 
mv: Verschieben von „nutzer.1.gz“ nach „~/public_html/man/man1/“ nicht möglich: Datei oder Verzeichnis nicht gefunden 
[email protected]:~/spr/man/de$ ls 
gzip mkdoc nutzer.1 nutzer.1.gz nutzer.pod rbsh 
[email protected]:~/spr/man/de$ mv nutzer.1.gz ~/public_html/man/man1/ 
[email protected]:~/spr/man/de$ 

我是这样做的学校,所以答案会很好。我们得到结果的方式并不重要,尽管我所尝试的方式似乎没有任何安全性。

回答

2

`head -n7 mkdoc|tail -n1`由命令的输出,这是mv nutzer.1.gz ~/public_html/man/man1/取代。这个输出然后被解释为一个命令,一个mv命令。

但是,它失败了,因为代字符扩展已经执行。在这一点上,~未被您的主目录替代;它只是一个简单的代字符。这是因为如果你曾试图执行

'mv' 'nutzer.1.gz' '~/public_html/man/man1/' 

对于您不能使用$HOME同样的原因,或第二套反引号或任何其他动态结构。要做到这一点,你需要使用eval,或将字符串传递给第二个shell。

eval `head -n7 mkdoc|tail -n1` 
bash -c "`head -n7 mkdoc|tail -n1`" 
1

波形符号“〜”不在反引号内插入。

[编辑] 相反,你应该能够使用:EVAL “$(头-n7 mkdoc |尾-N1)”

+0

,所以我可以用$ HOME,而不是我把它 – vecvan 2010-11-12 02:57:03

+0

没有,但你可以使用eval: – 2010-11-12 02:58:14

+0

EVAL “头-n7 mkdoc |尾-n1” #应该工作 – 2010-11-12 02:58:52