выполнение оператора if из командной строки


19

В Bash я могу сделать следующее:

if [ -f /tmp/test.txt ]; then echo "true"; fi

Однако, если я добавлю sudoвперед, это больше не будет работать:

sudo if [ -f /tmp/test.txt ]; then echo "true"; fi
-bash: syntax error near unexpected token `then'

Как я могу заставить это работать?


1
Смотрите этот ответ на SO ...
Jasonwryan

Лучше практиковаться sudoтолько на testи / или только на echo. Не все ifутверждение.
Джиппи

Вы имеете в виду if sudo test? Да, так будет лучше. Я не могу использовать testбез if, потому что он устанавливает код выхода в противном случае.
m33lky

Ответы:


14

sudoвыполняет свой аргумент, используя execне интерпретатор оболочки. Следовательно, он ограничен действительными двоичными программами и не может использовать функции оболочки, псевдонимы или встроенные функции ( ifявляется встроенной функцией ). Обратите внимание, что параметры -iи -sмогут использоваться для выполнения заданных команд в оболочке входа в систему или не входа в систему, соответственно (или только в интерактивном режиме оболочки; обратите внимание, что вам придется избегать точек с запятой или заключать команду в кавычки).

$ sudo if [ -n x ]; then echo y; fi
-bash: syntax error near unexpected token `then'
$ sudo if [ -n x ]\; then echo y\; fi
sudo: if: command not found
$ sudo -i if [ -n x ]\; then echo y\; fi
y
$ sudo -s 'if [ -n x ]; then echo y; fi'
y

Итак, если я использую -iили -s, if-оператор будет оценен правильно?
m33lky

1
Да, если он указан или экранирован правильно. Смотрите мое редактирование.
Кевин

9

Попробуйте вызвать строку как строковый аргумент через оболочку.

sudo /bin/sh -c 'if [ -f /tmp/test.txt ]; then echo "true"; fi'
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.