2016-12-23 5 views
0

У меня есть текстовый файл (test.txt), содержимое которого являются:Невозможно выполнить команду с Eval

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

Почему вы используете 'eval'? действительно ли вам нужно выполнить содержимое в текущей оболочке? в этом случае _source_ it с '. test.txt', выполните его с помощью 'bash test.txt'. –

+0

Мне не ясно, в каком сценарии 'eval' может быть лучше, чем просто' bash test.txt' или '. test.txt'. Не могли бы вы подробнее рассказать? – Dario

+0

Для того, чтобы заставить его работать с концами строк, см. [Здесь] (http://stackoverflow.com/questions/16768776/convert-line-endings), вы должны удалить возвращаемые символы '\ r' –

ответ

1

Просто используйте tr содрать окна CRLF файлы окончаний и преобразовать его в UNIX линии терминации строку

tr -d '\015' <file_with_DOS_endings >file_UNIX_endings 

Чтобы запустить оригинальную команду с вышеуказанной логикой вызвать явную подоболочку с -c флагом ,

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

Да. Я только что заметил, что он работает, если я выполняю: eval "$ (cat test.txt | tr -d '\ 15 \ 32')". Измените свой ответ, чтобы включить эту команду, и я приму это. Я не хочу создавать дополнительный файл во время процесса. – ka3ak

+0

@ ka3ak: Я удалил бесполезное использование кошки и явное использование eval. – Inian

+0

Вы слишком быстро :) Когда я увидел, что ваш ответ был прав (и работал!), Я принял его, но теперь он снова неверен. – ka3ak

0

Корпуса не нравятся файлы с окончанием строки Windows/DOS. Они рассматривают возврат каретки ('\ r') как часть последнего слова.

Хуже того, когда возврат каретки выводится как часть сообщения об ошибке, он помещает курсор в начало строки, в результате чего текст предыдущего сообщения перезаписывается. Это объясняет искаженное сообщение.

Для запуска сценария оболочки, хранящегося в файле, вы просто делаете его исполняемым (chmod +x test.txt), затем ./test.txt. Нет необходимости в eval.

Вы можете конвертировать DOS файлы в Unix-файлов с

dos2unix test.txt 

удалить возврат каретки.

 Смежные вопросы

  • Нет связанных вопросов^_^