"$*"
собирает все позиционные параметры ($1
, $2
, ...) в одно слово, разделенное одним пробелом (в более общем случае, первый символ $IFS
).Обратите внимание, что в терминологии оболочки слово может содержать любой символ, включая пробелы: "foo bar"
или foo\ bar
парсит до одного слова.Например, если есть три аргумента, "$*"
эквивалентно "$1 $2 $3"
.Если аргумента нет, то "$*"
эквивалентно ""
(пустое слово).
"$@"
- это специальный синтаксис, который расширяется до списка позиционных параметров, каждый из которых имеет собственное слово.Например, если есть три аргумента, то "$@"
эквивалентно "$1" "$2" "$3"
.Если аргумента нет, то "$@"
эквивалентно ничему (пустой список, а не список с одним пустым словом).
"$@"
почти всегда то, что выхотите использовать, в отличие от "$*"
или без кавычек $*
или $@
(последние два в точности эквивалентны и выполняют генерацию имени файла (также называемое «подстановкой») и разбиение слов по всем позиционным параметрам).
Есть еще одна проблема, которая заключается в том, что su
за исключением одной команды оболочки в качестве аргумента -c
, и вы передаете ей несколько слов.У вас было подробное объяснение правильного цитирования , но позвольте мне добавить совет о том, как сделать это правильно, что обходит проблемы двойного цитирования.Вы также можете обратиться к https://unix.stackexchange.com/questions/3063/how-do-i-run-a-command-as-the-system-administrator-root для получения дополнительной информации о sudo
и su
.
sudo
уже запускает команду от имени пользователя root, поэтому нет необходимости вызывать su
,Если у вашего скрипта нет аргументов, вы можете просто запустить оболочку напрямую;если ваша версия sudo
не очень старая, есть вариант для этого: sudo -s
.Таким образом, ваш сценарий может быть:
#!/bin/sh
if [ $# -eq 0 ]; then set -- -s; else set -- -- "$@"; fi
exec sudo "$@"
(остальная часть предназначена для обработки редкого случая команды, начинающейся с -
.)
Я бы не стал беспокоиться о такойхотя короткий сценарий.Выполнение команды от имени root необычно и достаточно рискованно, поэтому ввод трех дополнительных символов не должен быть проблемой.Запуск оболочки от имени root еще более необычен и рискован и, безусловно, заслуживает еще шести символов.