Alias ​​de várias linhas no bash

13

Eu tenho o seguinte script. É um caso de teste simples, em que aqualquer valor de string e bdeve ser um caminho.

#!/bin/bash

alias jo "\
echo "please enter values "\
read a \
read -e b \
echo "My values are $a and $b""

No entanto, sempre que tento executar ./sample.sh, recebo os seguintes erros:

./sample.sh: line 3: alias: jo: not found
./sample.sh: line 3: alias: echo please: not found
./sample.sh: line 3: alias: enter: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: read a read -e b echo My: not found
./sample.sh: line 3: alias: values: not found
./sample.sh: line 3: alias: are: not found
./sample.sh: line 3: alias: and: not found
./sample.sh: line 3: alias: : not found

e quando tento source sample.sh, obtenho o seguinte:

a: Undefined variable.

Meu objetivo era tornar isso um alias para que eu pudesse obter esse script e apenas executá-lo para executar a linha de comandos. Alguém pode olhar para isso e me informar qual é o erro?

Jovin Miranda
fonte
3
Quando você acha que precisa de alias de múltiplas linhas e comandos múltiplos, é hora de definir uma função ou criar um script.
Sergiy Kolodyazhnyy 02/09/19
@SergiyKolodyazhnyy observou que
Jovin Miranda

Respostas:

15

Você tem alguns problemas aqui

  1. ao contrário de csh, em bash(e em outros invólucros tipo Bourne), os aliases são atribuídos com um =sinal, por exemploalias foo=bar

  2. aspas não podem ser aninhadas assim; Nesse caso, você pode usar aspas simples ao redor do alias e aspas duplas dentro

  3. a barra invertida \é um caractere de continuação de linha : sintaticamente, ele transforma seu comando em uma única linha (o oposto do que você deseja)

então

#!/bin/bash

alias jo='
echo "please enter values "
read a 
read -e b 
echo "My values are $a and $b"'

Teste: primeiro criamos o arquivo:

$ . ./myscript.sh

então

$ jo
please enter values 
foo bar
baz
My values are foo bar and baz

Se você deseja usar o alias dentro de um script, lembre-se de que os aliases são ativados apenas por padrão em shells interativos: para habilitá-los dentro de um script, você precisará adicionar

shopt -s expand_aliases

Independentemente de tudo acima, considere usar uma função shell em vez de um alias para coisas como esta

chave de aço
fonte
1
Outra razão para usar aspas simples em torno do alias é que as variáveis dentro de aspas duplas são expandidos, por isso $ae $bseria expandido em tempo de definição, não quando o alias é executado.
Barmar
Obrigado pela solução, o problema aqui é, apesar de eu escrever o script fornecido por você e quando o executo, recebo jo: command não encontrado o alias por algum motivo, não é registrado. quando eu fonte o arquivo, em seguida, recebo este erro incomparável ". a única razão pela qual estou fazendo alias e não função é porque eu quero chamar esta linha de código na linha de comando e na função eu não sei como conseguir isso. a chamada de função é geralmente dentro do script uso de apelido era apenas para garantir que eu possa usá-lo como uma função e chamá-lo sempre que eu quiser.
Jovin Miranda
de qualquer maneira corrigido, eu estava usando o shell padrão como tcsh, portanto, o problema estava chegando.
Jovin Miranda
8

Acostume-se a usar funções no shell do tipo POSIX. Você não tem nenhum dos problemas de cotação:

jo () {
    read -p "Enter value for 'a': " -e a 
    read -p "Enter value for 'b': " -e b 
    echo "My values are $a and $b"
}
Glenn Jackman
fonte
Obrigado pela solução, isso funcionou quando eu chamo a função dentro do script. Como eu chamo a função da própria linha de comando, porque tenho vários scripts desse tipo e preferiria uma situação em que eu escrevesse todas as funções em um arquivo, mas as chamasse da linha de comando. Essa foi a razão pela qual eu fui para o apelido
Jovin Miranda
É exatamente o mesmo. Coloque as funções em um arquivo e fonte que arquivo
Glenn Jackman
entendi o que eu realmente fiz é usar o foll. comando "$ @" para que eu pudesse chamar o nome da função ao executar o arquivo
Jovin Miranda