Шебанг под Linux не разделяет аргументы - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть скрипт kotlin (но это может быть любая команда Linux с аргументами), например:

#!/usr/bin/env kotlinc -script
println("hello world")

Когда я запускаю его в Ubuntu, я получаю:

/usr/bin/env: ‘kotlinc -script’: No such file or directory

, но когдаЯ бегу в командной строке:

/usr/bin/env kotlinc -script

Работает.Нет проблем с поиском пути, потому что скрипт:

#!/usr/bin/env kotlinc
println("hello world")

работает

По какой-то причине в Ubuntu "#!/usr/bin/env kotlinc -script" обрабатывает "kotlinc -script" как один аргумент.Но только в заголовке сценария оболочки.

Мне нужно явно запустить мой скрипт "#!/usr/bin/env kotlinc -script", потому что я хочу, чтобы он правильно работал в других дистрибутивах и средах, в которых "kotlin" находится в $PATH.

Есть ли ошибка в Ubuntucoreutils или что?Есть ли способ это исправить?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Проверьте версию coreutils:

apt-cache policy coreutils

Начиная с coreutils 8.30, вы сможете использовать:

#!/usr/bin/env -S command arg1 arg2 ...

Возможно, вы захотите обновить coreutils

0 голосов
/ 23 февраля 2019

В Linux вы не можете передать более одного аргумента через строку shebang.Все аргументы будут переданы в виде одной строки в исполняемый файл:

#!/bin/foo -a -b -c

передаст одну опцию "-a -b -c" в /bin/foo плюс содержимое файла.Например, если бы вы позвонили:

/bin/foo '-a -b -c' contents-of-file.txt

В настоящее время поведение большинства производных Unix должно быть одинаковым, но оно может отличаться, я не проверял их все:)

Труднонайти соответствующую документацию для этого, лучшее, что я мог быстро найти, это: https://www.in -ulm.de / ~ mascheck / различным / shebang / # расщепление


В качестве обходного путивы обычно создаете оболочку оболочки:

#!/bin/bash
exec kotlin --arg1 --arg2 ... /path/to/kotlin-script
...