alias -g '$ {1 + “$ @”}' = '“$ @”', o que isso faz?

2

A maioria dos makefiles tem este estranho conjunto de símbolos '${1+"$@"}' . $ @ é o nome do arquivo de destino do makefile. Mas por que as pessoas tentam usar o símbolo complexo como '${1+"$@"}' ?

    
por Madhavan Kumar 22.03.2015 / 18:23

1 resposta

8

O objetivo de ${1+"$@"} para portabilidade.

POSIX definido $ @ se expandiria a nada se não houvesse argumentos posicionais . Mas o shell original do Bourne ( /bin/sh no Solaris 10 e antes) o expandia para a string vazia "" . Usar ${1+"$@"} é uma solução para isso, desde quando "$@" expandiu apenas se $1 foi definido.

Infelizmente, essa construção não funciona no zsh 3.xe no pre 4.3, porque o zsh executa a palavra dividir em ${1+"$@"} no modo de emulação sh ( shwordsplit foi definido) :

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

"$@" é tratado corretamente:

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

Portanto, alias -g '${1+"$@"}'='"$@"' garante que a divisão de palavras nunca seja executada ao usar ${1+"$@"} . Isso permite que a construção ${1+"$@"} seja usada em zsh, já que ela será substituída por "$@" antes da expansão (você deve usar exatamente a cadeia de caracteres ${1+"$@"} , sem caracteres iniciais ou finais).

Outro trabalho em torno de você pode fazer, é ignorar completamente usando "$@" se não houver argumentos posicionais, verificando $# :

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

Demorou mais trabalhos, mas completamente portáteis.

    
por 22.03.2015 / 18:54

Tags