виконання if-оператора з командного рядка


19

У баші я можу зробити наступне:

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'

Як я можу змусити його працювати?



Краще практикувати 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.