Intereting Posts
Как использовать настоящий PCI-модем в виртуальной машине? Как переименовать несколько файлов в их содержание «сумма MD5? Запуск любого сценария входа в систему, когда sh связан с bash qemu: загрузка из cdrom Почему бы просто не использовать стандартные потоки вместо использования имен файлов? Правильно ли я понимаю ядра? Как отключить автоматическое приостановление, когда я закрываю крышку ноутбука? Как определенно перемещать файл, не перезаписывая ничего При использовании btrfs, почему значения «Размер», «Использовать» и «Использовать» из df не совпадают? Могу ли я скопировать базу данных MySQL, скопировав файлы? Что конкретно содержат файлы? Создание списка воспроизведения Icecast с консоли Почему моя служба Before = sleep.target запускается * после возобновления *? apt-get удалить php5 без установки apache2 Мониторинг, когда чтение / запись по метаданным или mmaped-файлы попадают на диск В FreeBSD, как вы отправляете почтовое сообщение от пользователя на одном сервере пользователю на другом сервере?

alias -g '$ {1 + "$ @"}' = '"$ @"', что он делает?

В большинстве make-файлов есть этот странный набор символов '${1+"$@"}' . $ @ – это имя файла в файле makefile. Но почему же люди пытаются использовать сложный символ, например '${1+"$@"}' ?

Назначение ${1+"$@"} для переносимости.

POSIX, определяемый $ @, не будет расширяться до нуля, если нет позиционных аргументов. Но оригинальная оболочка Bourne ( /bin/sh в Solaris 10 и ранее) расширила ее до пустой строки "" . Использование ${1+"$@"} – это работа для этого, поскольку, когда "$@" только расширялся, если был задан $1 .

К сожалению, эта конструкция не работает в zsh 3.x и pre 4.3, так как zsh выполняет разбиение слов на ${1+"$@"} в режиме эмуляции sh ( shwordsplit ):

 $ set -- '1 2' $ for i in ${1+"$@"}; do echo $i; done 1 2 

"$@" обрабатывается должным образом:

 $ set -- '1 2' $ for i in "$@"; do echo $i; done 1 2 

Таким образом, alias -g '${1+"$@"}'='"$@"' гарантирует, что разбиение слов никогда не будет выполняться при использовании ${1+"$@"} . Это позволяет использовать конструкцию ${1+"$@"} в zsh, так как она будет заменена на "$@" перед расширением (вы должны точно использовать символьную строку ${1+"$@"} , нет ведущих или конечных слов символов).


Другая работа, которую вы можете сделать, полностью игнорирует использование "$@" если нет позиционных аргументов, проверяя $# :

 case $# in (0) func ;; (*) func "$@" ;; esac 

Это потребовало большего количества работ, но полностью портативных.