Abrindo aliases no Bash

1

Convertendo um arquivo .cshrc antigo em um arquivo .bash_aliases. Eu me deparei com alguns problemas de sintaxe em relação à conversão, mas isso envolve um pouco mais de conhecimento profundo do Bash.

Em [t] Csh, o shell travaria ao abrir aplicativos xwindow, a menos que eles fossem abertos em segundo plano usando um E comercial (por exemplo, firefox &) . Para evitar isso, criaria certos aliases no Csh para executar a tarefa em segundo plano, mas ainda deixe a linha de comando aberta para opções (usando \!* ):

alias ff 'firefox \!* &

Quando isso for convertido em Bash, será feito algo assim:

ff () { command ff "$@" & }

Eu ainda não tenho certeza de quando usar uma função e quando usar alias , mas eu tive uma situação difícil ao tentar envolver mais opções em torno de um alias já definido:

win () { command xterm -geometry 105x25 -font 8x13 -bc "$@" & }
blue () { command win -bg gray33 -fg gray39 "$@" ; }

Se eu remover o comando dentro de azul (por exemplo, blue () { win -bg ... ), ele funcionará como esperado.

Estou curioso sobre duas coisas:

  1. Quando usar alias vs definições de função?
  2. Quando usar o comando; se eu fizesse alias win='xterm ...' eu teria que fazer command win então?
por BotNet 06.10.2016 / 21:52

1 resposta

3

Um, use funções para qualquer coisa não-trivial; um alias trivial seria definir algum sinalizador por padrão:

# no license spam
alias gdb='gdb -q'

para praticamente qualquer coisa mais complicada eu uso uma função.

Dois, command refere-se a um comando, como /bin/ls ou similares; aliases não são comandos nem comandos de funções. Você provavelmente não tem o comando win , portanto, command win falhará ao chamar a função, já que isso não é um comando.

Os loops "Infinite" são realmente fáceis de criar, a propósito

alias fooalias=foofunc
function foofunc() { fooalias; }

e é por isso que se alguém está escrevendo uma função com o mesmo nome de um comando então command se torna muito útil, então o shell não tenta chamar a função para sempre:

# loops until stack death or segfault or something
function xterm() { xterm ... }

# good
function xterm() { command xterm ... }

Se você está apenas tentando obter alguma outra função para chamar outra coisa que pode ser um comando ou uma função, apenas chame-a como está. Aquele que precisa chamar o comando deve usar command .

function winwinwin () { winwin ... }
function winwin () { win ... }
function win () { xterm ... }
function xterm () { command xterm ... }

winwinwin chamaria a função winwin chamaria a função win chamaria a função xterm e, em seguida, chamaria o nome command .

No function front, isso é opcional, mas eu o uso, pois torna a busca por funções bastante fácil ( fgrep function ... ) do que ter que procurar por coisas seguidas por espaços em branco e errar que os parênteses precisam ser ignorados. no motor regex que estou usando? Para a prioridade, é fácil fazer testes ou imprimir avisos que mostram o que está acontecendo:

ls () { ls -k; echo funcall; }
alias ls='echo blat'
ls

Em geral, é provavelmente uma idéia melhor definir as funções primeiro e os aliases depois desses serem configurados, para surpresa mínima:

bash-4.1$ alias ls='echo blat'
bash-4.1$ ls () { command ls -k; echo funcall; }
bash: syntax error near unexpected token '('
bash-4.1$ function ls () { command ls -k; echo funcall; }
bash-4.1$ 
    
por 06.10.2016 / 23:20

Tags