无法使用eval执行命令

时间:2016-12-23 12:10:18

标签: bash eval mplayer

我有一个文本文件(test.txt),其内容为:

mplayer -fs video.avi -vf mirror

如果我执行:

eval "$(cat test.txt)"

我明白了:

 doesn't exist.or
Error parsing option on the command line: -vf
MPlayer 1.1-4.8 (C) 2000-2012 MPlayer Team

但如果我执行:

mplayer -fs video.avi -vf mirror

视频将播放。

为什么eval(或mplayer?)在这种情况下会失败?

我跑了:

$ file test.txt
test.txt: ASCII text, with CRLF line terminators

文本文件似乎是在Windows下创建的。我复制了它的内容并在Linux下创建了一个新文件。现在它有效。

但是如何使用原始Windows文件呢?我必须更换一些角色吗?

2 个答案:

答案 0 :(得分:1)

只需使用tr去除窗口CRLF文件结尾并将其转换为UNIX行终止字符串

tr -d '\015' <file_with_DOS_endings >file_UNIX_endings

使用上述逻辑运行原始命令,调用带有-c标志的显式子shell,

bash -c "$(tr -d '\15\32' < "test.txt")"

答案 1 :(得分:0)

外壳不喜欢带有Windows / DOS行结尾的文件。他们将回车('\ r')视为最后一个字的一部分。

更糟糕的是,当回车输出作为错误消息的一部分时,它将光标放在行的开头,导致先前的消息文本被覆盖。这解释了乱码消息。

要运行存储在文件中的shell脚本,只需将其设为可执行文件(chmod +x test.txt),然后./test.txt。无需eval

您可以使用

将DOS文件转换为Unix文件
dos2unix test.txt

删除回车。