Ваш
echo 'echo foobar' >whoami
chmod +x whoami
работает некорректно.
Python не выбирает его как исполняемый файл, хотя бит выполнения установлен, он не знает об этом сначала нужно запустить bash, чтобы выполнить, таким образом, он пропускает путь и запускает исходный whoami, который пропатчен / usr / bin / whoami
добавление shebang
echo "#!/bin/sh" > whoami
echo 'echo foobar' >> whoami
chmod +x whoami
On В системах стиля Unix (включая Linux / OS X) строка shebang, как она называется, сообщает загрузчику (или ядру, или иногда оболочке), какую программу использовать для запуска файла. В самом начале c вы должны указать путь к интерпретатору python.
Я подозреваю, что если вы ./whoami (с установленным разрешением на выполнение), оболочка делает некоторые дополнительные действия c поэтому вам не нужно вводить / bin / sh $ PWD / whoami
, если вы выполняете
chmod -x whoami
, вы можете использовать специальный
. ./whoami (указать оболочке выполнить его как сценарий оболочки).
обратите внимание, что execvp должен использовать / bin / sh, а не bash. также . ./whoami будет зависеть от того, какую оболочку вы используете, большинство из них будет "исходным" файлом, а не запускать его в другом процессе (т.е. изменения в среде, рабочем каталоге и т. д. c останутся)
Если нет заголовка shebang или исполняемого файла, оболочка просто использует себя в качестве интерпретатора по умолчанию (но только при вызове через ./whoami;. ./Whoami отличается, она создает файл, независимо от того, является ли он исполняемым).
Запутанная природа execvp (POSIX, а не Python), по-видимому, также делает это. Python в этом случае не работает, потому что os.execvp фактически не вызывает execvp изнутри, его сходство только в названии.