Предположим, у меня есть исполняемый файл xyz который принимает переменное количество аргументов командной строки и сценарий оболочки Korn оболочки xyz.ksh. Есть ли простой способ передать все аргументы сценария оболочки как есть в исполняемый файл?
Вам нужно использовать:
"$@"
для правильного расширения параметров во всех случаях. Это поведение одинаково как в bash, так и в ksh.
В большинстве случаев $ * или $ @ дают вам то, что вы хотите. Однако они расширяют параметры пробелами. «$ *» сводит все параметры к одному. «$ @» дает вам то, что фактически было передано в сценарий оболочки.
Убедитесь сами (опять же, в bash или ksh):
[tla ~]$ touch file1 file2 space\ file
[tla ~]$ ( test() { ls $*; }; test file1 file2 space\ file )
ls: cannot access space: No such file or directory
ls: cannot access file: No such file or directory
file1 file2
[tla ~]$ ( test() { ls $@; }; test file1 file2 space\ file )
ls: cannot access space: No such file or directory
ls: cannot access file: No such file or directory
file1 file2
[tla ~]$ ( test() { ls "$*"; }; test file1 file2 space\ file )
ls: cannot access file1 file2 space file: No such file or directory
[tla ~]$ ( test() { ls "$@"; }; test file1 file2 space\ file )
file1 file2 space file
Я думаю, вы ищете переменную $ *: http://www.well.ox.ac.uk/~johnb/comp/unix/ksh.html#commandlineargs
Думаю, в bash он иначе известен как $ @.
Да. Используйте переменную $ *. Попробуйте этот сценарий:
#!/bin/ksh
echo $*
а затем вызовите скрипт примерно так:
scriptname a b c foobar
Ваш вывод будет:
a b c foobar