Substituição do histórico do alias do bash semelhante a \! * No csh


3

Minha pergunta é muito semelhante à deste post antigo .

Eu gostaria de fazer algo semelhante: coloque em um alias o último argumento digitado na linha de comando atual. Isso seria equivalente ao csh \!*que pode ser usado em aliases.

De acordo com o post mencionado, parece que o problema é a expansão do histórico do bash, e é por isso que o fc é usado. A idéia seria fazer a substituição funcionar no meio de uma cadeia de comandos, como alias cat='cat -n !!:* && echo ""'(como um exemplo simplificado, que não funciona por causa do problema de expansão).

No entanto, isso difere do post referenciado no sentido em que eu quero pegar apenas os argumentos além do primeiro comando (ou seja, no post, eles pegam a linha inteira, em vez da linha inteira, exceto o argumento do zero-th, o comando próprio).

Qual é a melhor maneira de fazer isso em um alias do bash? (Nota: procurando manter isso como um alias, não procurando um script ou função).


Há uma grande diferença entre um script e uma função. Uma função bash vive na memória, como um pseudônimo; não há razão para não usar um aqui. Usar substituições de histórico em aliases do csh para fazer mais do que a simples substituição do comando é um hack necessário apenas porque o csh não possui sub-rotinas adequadas.
Mark Reed

Respostas:


2

É melhor evitar aliases para outras coisas que não sejam simples substituições de um comando. Para usar argumentos, vários comandos, etc., você pode definir uma função , acessando parâmetros da mesma maneira que faria em um script:

foo() {
    do_this
    do_that "$1"
}

cat() { command cat "$@" && echo ""; }

(Normalmente, as funções substituem os executáveis; portanto, command caté necessário se você deseja pular a função e executar diretamente o executável.)


Obrigado, mas adicionei a edição "(Nota: procurando manter isso como um alias, não procurando um script ou função)." Os aliases podem ser uma ferramenta poderosa e - mesmo que apenas por razões acadêmicas - eu prefiro ver o que é necessário para obter essa funcionalidade equivalente (por exemplo, em comparação com outros shells, como o csh). Em um token separado, talvez isso seja, em última análise, mais uma diferença da mentalidade do bash versus outros paradigmas de shell?
bossNova

Os aliases nunca foram destinados a apoiar argumentos no meio de um alias; eles sempre foram apenas uma simples substituição de comando. Usando expansão história dentro um alias sempre foi um hack horrível, e nos dias de hoje é usado principalmente em conchas que não suportam nada melhor - eo bash não tem uma opção melhor; ou seja, funções.
grawity
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.