无法使用 eval 执行命令

Cannot execute a command with eval

我有一个文本文件 (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 文件一起工作?我必须替换一些字符吗?

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

tr -d '5' <file_with_DOS_endings >file_UNIX_endings

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

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

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

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

要 运行 一个存储在文件中的 shell 脚本,您只需使其可执行 (chmod +x test.txt),然后 ./test.txt。不需要 eval.

您可以使用

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

删除托架 returns。