O comando funciona no bash shell, mas não no alias

1

Estou executando um comando como tal:

submit -n 72 -x '--mail-type=END -N2'

Este comando funciona. No entanto, quando eu o defino como um alias:

alias foo='submit -n 72 -x '--mail-type=END -N2''

falha com o erro:

bash: alias: -N2: not found

No entanto, esse alias funciona bem:

alias foo='submit -n 72 -x '-N2''

Portanto, há algo específico sobre o fragmento --mail-type = END que causa problemas.

EDIT: Alterado alias = '... para alias foo =' ...

    
por captainalright 19.04.2017 / 23:24

2 respostas

3

A citação está desativada. Em vez disso, tente usar "" para conter '' (embora "" interpola $variables , o que você pode ou não querer)

alias="submit -n 72 -x '--mail-type=END -N2'"

Ou use o truque '\'' para "finalizar a cota simples atual, inserir uma citação literal e reiniciar a cota simples atual". Ou seja, qualquer ' interno é substituído por '\''

alias='submit -n 72 -x '\''--mail-type=END -N2'\'''

Veja como eu verifiquei se a citação produzia uma única string ininterrupta e não duas palavras como a sua:

# not ok, two distinct words
$ perl -E 'say for @ARGV' 'submit -n 72 -x '--mail-type=END -N2''
submit -n 72 -x --mail-type=END
-N2

# ok, a single string
$ perl -E 'say for @ARGV' 'submit -n 72 -x '-N2''                
submit -n 72 -x -N2
$ 

# ok, single quotes within doubles
$ perl -E 'say for @ARGV' "submit -n 72 -x '--mail-type=END -N2'"
submit -n 72 -x '--mail-type=END -N2'

# ok, '\'' trick
$ perl -E 'say for @ARGV' 'submit -n 72 -x '\''--mail-type=END -N2'\'''
submit -n 72 -x '--mail-type=END -N2'
$ 

Quanto a foo='submit -n 72 -x '-N2'' , isto é não aninhado; aspas no unix não aninham, é por isso que os shells têm $(cmd ... $(cmd ...)) em vez de tentar descobrir como aninhar isso usando apenas backticks. foo='submit -n 72 -x '-N2'' é uma maneira mais detalhada e complicada de dizer foo='submit -n 72 -x '-N2 ou simplesmente mais foo='submit -n 72 -x -N2' .

    
por 19.04.2017 / 23:40
1

Você não pode aninhar aspas. Uma solução simples é usar aspas diferentes:

alias foo='submit -n 72 -x "--mail-type=END -N2"'

Uma solução muito melhor é não usar um alias. Use uma função em vez disso.

foo () {
    submit -n 72 -x '--mail-type=END -N2' "$@"
}
    
por 20.04.2017 / 05:43

Tags