Por que “source (cmd)” está funcionando, mas não “$ (cmd)”?

1

Eu quero ter um script para chamar com params que adicione alguns aliases ao meu shell atual. Os aliases precisam ser construídos em relação aos parâmetros de chamada e ao diretório atual de onde eu os iniciei. Se possível, eu gostaria de não ter que criar o script, apenas executá-lo como qualquer outro script.

Isso é o que eu fiz até agora:

Eu escrevi um pequeno script de shell para gerar alguns aliases, como

echo 'alias foo="$1"'

e salve-o como arquivo "myscript" com os direitos + x. Então eu executo via console para configurar o alias

$(myscipt hello)

que funciona bem

Quando eu mudo meu script de shell como

echo 'alias foo="bar $1 -param"'

e execute novamente como acima, o resultado é

bash: alias hello" not found
bash: alias -param" not found

??? Eu já escapei dos espaços em branco entre o bar e o -param, mas não consigo trabalhar.

quando executo

source <(myscript hello)

está tudo bem como esperado (essa é a minha solução até agora, mas não tenho certeza se é a melhor).

Algumas ideias de como obter uma solução melhor?

    
por Tom Freudenberg 15.10.2014 / 17:19

2 respostas

5

Você está usando o comando source errado. Eu estou supondo que você tenha um arquivo chamado myscript que contém esses comandos. Em vez de ter coisas para gerar os comandos certos no arquivo, como este

echo 'alias foo="bar -param"'

você deve ter apenas os comandos, como este

alias foo="bar -param"

Em seguida, você passa o script diretamente para o comando source , que o executa no shell atual para que as alterações feitas no script sejam refletidas na sessão atual do shell:

source myscript

Além disso, o comando . é equivalente:

. myscript

(Observe que há um espaço entre o . e o myscript .)

Atualizar

Em resposta ao seu comentário: você deve apenas usar um arquivo. Como o nome de um alias pode ser definido usando um valor variável, basta adicionar a lógica no arquivo para fazer todos os aliases dinâmicos. Aqui está um exemplo super simples:

$ foo=hello
$ alias $foo='echo hi'
$ hello
hi

Você pode usar condições, loops, etc. para criar uma lógica muito mais complexa para seus aliases dinâmicos.

    
por 15.10.2014 / 17:24
0

set -x acaba sendo informativo:

: $; set -x
: $; $(./alias-builder)
++ ./alias-builder
+ alias 'foo="bar' '$1' '-param"'
bash: alias: $1: not found
bash: alias: -param": not found
: $; 

Então, o que está acontecendo aqui é que quando o bash está tratando a saída de alias-builder (que é o nome que dei a um script contendo seu comando echo) como algo para substituir inline como argumentos, está separando a saída em palavras , como normalmente poderia acontecer, mas tratar as citações como parte das palavras, em vez do que você está esperando, que é analisar a saída da maneira como se fosse digitado.

Acho que, no final, sua resposta é usar a opção source .

Agora, se for inconveniente digitar, você pode fazer algo assim:

metamyscript() {
    source <(myscript "$@")
}

E então você deve ser capaz de fazer isso simplesmente:

: $; metamyscript hello

e executará myscript hello e fornecerá a saída disso.

(Claro, você poderia mudar os nomes ao seu gosto.)

    
por 16.10.2014 / 20:46