sh - Usando argumentos em funções .profile

1

Eu quero usar um argumento na função que criei no meu arquivo .profile.

Eu quero pedir a entrada se nenhum argumento for dado, caso contrário, defina uma variável para $ 1.

Quando eu verifico $ 1 para ver se está vazio, recebo o seguinte erro:

sh[7]: 1: Parameter not set.

Na seguinte linha:

if [ ! -n "$1" ]; then

Estou usando sh não bash.

EDIT: Ok, aqui está a primeira linha de código até o final da instrução if:

HOST='hostname'
cd /opt/dirpath
ll *.sto


if [ x"$1" = x ]; then
  # Ask for input
  echo "File: \c"; read outFile
else
    outFile=$1
fi

Estou editando o código de outra pessoa para trabalhar com ou sem argumentos.

    
por James 09.07.2015 / 17:55

1 resposta

2

Eu acho que há mais para isso:

Ou esse não é o comando que você está usando - ou então, em algum outro lugar da função que você está fazendo de forma diferente. Esse erro vem de ${1?} . Ou vem do seu teste, mas somente se você fizer set -u .

Para consertar isso, pare de fazer isso. Do set +u; fn_name , e veja o que acontece. E se você tiver qualquer ${1?} de expansões, o erro não desaparecerá até você dar à função um argumento.

Aqui estão alguns exemplos de código de como você pode reproduzir esse erro:

sh -c 'fn(){ [ ! -n "${1?}" ]; }; fn'
sh: 1: 1: parameter not set

... ou ...

sh -uc 'fn(){ [ ! -n "$1" ]; }; fn'
sh: 1: 1: parameter not set

... mas ...

sh -uc 'fn(){ [ ! -n "$1" ]; }
        set +u; fn; echo "$?"'
0

... e ...

sh -c 'fn(){ [ ! -n "${1?}" ]; }
       fn some args; echo "$?"'
1

Se a função estiver configurando -u , provavelmente você deve editar isso. Ou então se o seu .profile estiver fazendo isso, o mesmo acontece. Na maioria dos casos, set -u é não uma configuração de shell persistente desejável, e isso ocorre porque esse modo é projetado para matar shells. Ele não fornece nenhum meio simples de lidar com os tipos de erros que gera - que é o que você está tentando fazer com [ test ] .

    
por 09.07.2015 / 19:33