использование sudo -u для запуска команд внутри сценариев оболочки

[12138] Итак, существует ли вариант Unix или платформа, вдохновленная unix (или компилятор, если это в основном зависит от компилятора?), который является стандартным, но намеренно странным, чтобы создавать ошибки и указывать на неопределенное поведение и непредсказуемость?[12139]Нет[115829], потому что...[12140]Это вообще разумная вещь, чтобы попытаться и реализовать?[12141]... нет, если разумная вещь означает "инструмент, который кто-либо разумно хотел бы использовать". Но [115832]да[115833] в том смысле, что это то, чем уже является обычный компилятор Си. Они неизбежно позволяют потакать неопределенному поведению определенным (предсказуемым) способом. Например:[12142]не определено, потому что вы модифицировали [115834]i[115835] несколько раз между точками следования. Однако, почти наверняка данный компилятор будет каждый раз выдавать один и тот же результат. Конечно, это не будет документировано, потому что не стоит делать этого в первую очередь, но компилятор может знать и сказать, если вы спросите об этом.[12143]Положите это в файл и скомпилируйте его, [115836]gcc undefined.c[115837]. Никаких проблем. Теперь попробуйте с включенными предупреждениями, [115838]gcc -Wall -pendantic undefined.c[115839]:[12144]Вот так. Теперь, имея в виду, что компилятор будет выдавать здесь каждый раз один и тот же результат, вы можете решить использовать это для любых целей. Это значит, что компилятор не может "намеренно... выдавать ошибки", когда вы делаете что-то не так, если мы определяем "ошибку" как что-то, чего вы не хотели. Он не знает, что вы хотите, чтобы случилось, и не может. Следовательно, она не может намеренно выдавать результат, который вы не можете предсказать.[12145]Она, очевидно, может, однако, "указывать на неопределённое поведение".[12146]Если вы хотите что-то, что может пойти дальше компилятора в обнаружении ошибок, обратите внимание на [12147]valgrind[12148]. Есть и другие (возможно, очень дорогие) вещи, но это единственное, что я использовал.[12149]Приняв что-то, что вы разработали исключительно на 64-битной машине и скомпилировав и запустив его 32-битным способом, вы также можете обнаружить много фасептима -- но очевидно, что [115842]а не[115843] идеальный способ исправления ошибок. [12150] Наконец: дефакто способ проверить программное обеспечение - это проверить его. [115845] Вы пишете конкретные тесты [115846] по ходу, [115847] и прогоняете их снова и снова: в конце дня, всякий раз, когда вы добавляете новый кусочек, и т.д. [115848] Этому нет замены.[12151]
2
24.10.2015, 16:43
2 ответа

Вы можете:

sudo -H -u name bash -c '[ -f "$HOME"/file ] || echo "file not found"'

[-f "$ HOME" / файл] || echo «файл не найден» делает именно то, что вы пытаетесь сделать с if..then .

От man sudo :

-H, --set-home

Запросить, чтобы политика безопасности установила для переменной среды HOME домашний каталог, указанный целевым запись в базе паролей пользователя. В зависимости от политики это может быть поведение по умолчанию.

1
27.01.2020, 22:20

Текущая оболочка видит точку с запятой и завершает на ней команду sudo ; таким образом, sudo видит , только если [! -f $ HOME / файл] . Предложения:

  1. Не используйте специальные символы, или
  2. укажите в кавычках всю команду sudo (непроверенной), или
  3. поместите команды в (временный, если необходимо) сценарий оболочки и укажите на это sudo.
0
27.01.2020, 22:20

Теги

Похожие вопросы