我有一个文本文件(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文件呢?我必须更换一些角色吗?
答案 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
删除回车。