Como usar 'no alias?

4

Eu tenho uma linha que quero chamar usando o alias.

while printf '%s ' "$(df -P / | awk 'NR==2 { print $(NF-1) }')"; do sleep 30; done

Eu tentei escapar de ' como \' , mas não funcionou.

Qual é a sintaxe correta para usar acima do one-liner no alias?

    
por Radek 23.04.2013 / 09:04

5 respostas

4
alias my_du=$'while printf \'%s \' "$(df -P / | awk \'NR==2 { print $(NF-1) }\')"; do sleep 3; done'

Você pode verificar o resultado com

alias my_du

Se $() for citado por " em vez de ' ou \ , ele será substituído e o resultado, e não a chamada de programa pretendida, se tornará parte da definição de alias.

    
por 23.04.2013 / 10:19
4

Você não pode escapar de aspas simples enquanto ainda está entre aspas simples porque \ é considerado literalmente em um contexto de aspas simples. Feche as aspas simples antes de escapar ou, melhor, use aspas duplas.

alias my_du="while printf '%s ' \"\$(df -P / | awk 'NR==2 { print \$(NF-1) }')\"; do sleep 30; done"
    
por 23.04.2013 / 09:05
4

Enquanto isso pode ser coaxed em um alias, funções são geralmente preferidas. De man bash :

For almost every purpose, aliases are superseded by shell functions.

Seu alias na forma de função:

my_du() {
    while printf '%s ' "$(df -P / | awk 'NR==2 { print $(NF-1) }')"
    do
        sleep 30
    done
}

Isso é mais legível e, portanto, mais sustentável.

    
por 23.04.2013 / 14:07
2

Você não pode usar uma barra invertida para escapar de uma aspa simples dentro de uma string entre aspas simples, porque a barra invertida em si é interpretada literalmente.

Você pode efetivamente escapar de uma aspa simples dentro de uma string entre aspas simples, escrevendo a seqüência de 4 caracteres '\'' . Formalmente, isso encerra o literal entre aspas simples, acrescenta uma aspa simples literal e inicia um novo literal com aspas simples. O resultado final é que você tem um caractere de aspas simples no meio de um literal entre aspas simples.

alias foo='while printf '\''%s '\'' "$(df -P / | awk '\''NR==2 { print $(NF-1) }'\'')"; do sleep 30; done'

Eu não recomendaria um alias tão complexo. Os aliases são principalmente destinados a fornecer um nome abreviado a um comando, possivelmente com switches. Isso vai muito além do seu alcance de conforto. Use uma função em vez disso.

foo () {
  while printf '%s ' "$(df -P / | awk 'NR==2 { print $(NF-1) }')"; do sleep 30; done
}
    
por 24.04.2013 / 03:26
1

Se você deseja comandos que aceitam argumentos ou interagem de alguma forma com o ambiente, use funções. Pelo menos no bash, os aliases são expandidos quando definidos, eles podem agir como se tivessem argumentos ou variáveis usadas. As vezes. A lei de Murphy garante que isso não funcionará quando realmente for necessário.

    
por 23.04.2013 / 14:17