无法使用 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。
我有一个文本文件 (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。