Escape shell arg из одного сценария в другой

Дано ./mysh0 :

 #!/bin/bash exec ./mysh1 $* 

И ./mysh1 :

 #!/bin/bash echo $1 echo $2 echo $3 

Как мне называть mysh0 , что аргументы mysh1 и то, что в конечном итоге напечатано, это «A», «B 2» и «C»?

Вызов этого как ./mysh0 A "B 2" C не работает.

Вы должны использовать "$@" вместо $* :

 exec ./mysh1 "$@" 

Это правильный способ расширить все позиционные аргументы как разделенные слова.

Когда вы используете $* , все позиционные аргументы были объединены в одну длинную строку с первым значением IFS качестве разделителя, по умолчанию равным пробелу, вы получили AB 2 C

Теперь, поскольку вы используете $* без двойной кавычки (что может привести к последствиям безопасности и заставить ваш скрипт задохнуться ), оболочка выполняет split+glob на нем. Длинная строка, которую вы получили выше, была разделена на четыре слова: A , B , 2 и C

Поэтому вы фактически передали четыре аргумента mysh1 вместо трех.