Как zsh интерпретирует не-абсолютные пути в shebangs? (WAS: Почему python3 -i допускает не абсолютные пути в shebang?)

Вам не хватает набора скобок:

System.out.println("Using == ::" + (s3==s4));

В вашей версии "Using == ::" + s3 сравнивается с == до s4, что вам не нравится.

В общем случае + имеет более высокий приоритет , чем ==, поэтому "Using == ::" + s3==s4 оценивается как ("Using == ::" + s3) == s4.

1
задан scubbo 13 July 2018 в 04:29
поделиться

1 ответ

Ядро не выполнит сценарий, если интерпретатор

  • указан как абсолютный путь, или
  • указан как путь относительно текущего рабочего каталога

Тогда, если ядро ​​отказывается выполнять скрипт, ваша оболочка может [// g0] взять верх и попытаться выполнить ее в любом случае, интерпретируя строку shebang в соответствии со своими собственными правилами (например, найти исполняемый файл в $PATH, например).

zsh пытается это сделать. sh не делает.

Однако способ zsh интерпретирует shebang (и, возможно, последующие строки) действительно действительно странно. Похоже, он всегда ожидает аргумент single после имени команды. Посмотрите, что он делает:

$ cat test.py 
#!python3 -b -i 

x=5
print('The value of x is ' + str(x))
$ strace -f -e execve zsh
execve("/bin/zsh", ["zsh"], 0x7ffd35c9e198 /* 78 vars */) = 0
host% ./test.py 
strace: Process 5510 attached
[pid  5510] execve("./test.py", ["./test.py"], 0x558ec6e46710 /* 79 vars */) = -1 ENOENT (No such file or directory)
[pid  5510] execve("/usr/bin/python3", ["python3", "-b -i", "./test.py"], 0x558ec6e46710 /* 79 vars */) = 0
[pid  5510] execve("/usr/lib/python-exec/python3.4/python3", ["/usr/lib/python-exec/python3.4/p"..., "-b -i", "./test.py"], 0x7fffd30eb208 /* 79 vars */) = 0
Unknown option: - 
usage: /usr/lib/python-exec/python3.4/python3 [option] ... [-c cmd | -m mod | file | -] [arg] ...
Try `python -h' for more information.
[pid  5510] +++ exited with 2 +++
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=5510, si_uid=1000, si_status=2, si_utime=0, si_stime=0} ---
host% 
+++ exited with 2 +++

Посмотрите, как ["python3", "-b -i", "./test.py"] передаются в качестве аргументов. Мне кажется очень противоречащим мне объединить два переключателя -b и -i вместе, но это то, что делает zsh. Python, очевидно, этого не понимает.

Когда аргументов нет, точное поведение зависит от наличия пробела после имени программы, но в любом случае это странно. Проверьте его с strace самостоятельно, потому что вы не собираетесь мне верить.

Я понимаю, что обработка zsh строки shebang просто глючит.

1
ответ дан n.m. 17 August 2018 в 13:41
поделиться
Другие вопросы по тегам:

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