Obtendo um erro de "redirecionamento ambíguo"

173

A seguinte linha no meu script Bash

 echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  ${OUPUT_RESULTS}

me dá este erro:

 line 46: ${OUPUT_RESULTS}: ambiguous redirect

Por quê?

Abra o caminho
fonte
10
você não está mostrando tudo. onde você conseguiu ${OUPUT_RESULTS}. Seu também um erro de ortografia, se você quis dizer$OUTPUT_RESULTS}
ghostdog74
se alguém escreveu, OUPUT_RESULTS = "filename.log"receberá um redirecionamento ambíguo. Porque o bash não precisa de espaço ao redor do =operador.
Poutrathor 17/01/19

Respostas:

269

Bash pode ser bastante obtuso às vezes.

Os seguintes comandos retornam mensagens de erro diferentes para basicamente o mesmo erro:

$ echo hello >
bash: syntax error near unexpected token `newline`

$ echo hello > ${NONEXISTENT}
bash: ${NONEXISTENT}: ambiguous redirect

$ echo hello > "${NONEXISTENT}"
bash: : No such file or directory

Adicionar aspas à variável parece ser uma boa maneira de lidar com a mensagem "redirecionamento ambíguo": você tende a receber uma mensagem melhor quando cometer um erro de digitação - e quando o erro ocorre devido a espaços no nome do arquivo, usar aspas é a correção.

Brent Bradburn
fonte
1
Você também receberá isso se redirecionar a saída de um script que contém redirecionamentos. Não me pergunte como eu sei disso.
Paul Jackson
@PaulJackson, ... isso não é verdade. Como demonstrador de cópia e pasta: sh -c 'echo hello >/tmp/hello' >/tmp/worldfunciona corretamente.
Charles Duffy
24

Você tem uma variável chamada OUPUT_RESULTSou é mais provável OUTPUT_RESULTS?


michael@isolde:~/junk$ ABC=junk.txt
michael@isolde:~/junk$ echo "Booger" > $ABC
michael@isolde:~/junk$ echo "Booger" >> $ABB
bash: $ABB: ambiguous redirect
michael@isolde:~/junk$ 
APENAS MINHA OPINIÃO correta
fonte
2
Se o seu ABC="junk file.txt", isso ainda teria o problema.
Charles Duffy
15

coloque aspas em torno de sua variável. Se houver espaços, ele também fornecerá "redirecionamento ambíguo". verifique também a ortografia

echo $AAAA"     "$DDDD"         "$MOL_TAG  >>  "${OUPUT_RESULTS}"

por exemplo, de redirecionamento ambíguo

$ var="file with spaces"
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> ${var}
bash: ${var}: ambiguous redirect
$ echo $AAAA"     "$DDDD"         "$MOL_TAG >> "${var}"
$ cat file\ with\ spaces
aaaa     dddd         mol_tag
ghostdog74
fonte
1
Citações não importam. Se houver espaços na expansão da variável, você simplesmente enviará as coisas para o arquivo errado e / ou mensagens de erro falsas envolvendo a parte do espaço após o nome do arquivo.
APENAS MINHA OPINIÃO correta
@JUSTMYcorrectOPINION, o shell não re-análise após expansões de parâmetros - o que significa que o conteúdo após o espaço dentro dos resultados de expansão não pode resultar em uma peça diferente da sintaxe a ser preenchido.
Charles Duffy
5

Descobri recentemente que espaços em branco no nome do arquivo de redirecionamento causarão a mensagem "redirecionamento ambíguo".

Por exemplo, se você redirecionar para application$(date +%Y%m%d%k%M%S).loge especificar os caracteres de formatação incorretos, o redirecionamento falhará antes das 10h, por exemplo. Se, no entanto, você usou application$(date +%Y%m%d%H%M%S).log, teria sucesso. Isso ocorre porque o %kformato gera ' 9'9h, onde %Hgera '09'9h.

echo $(date +%Y%m%d%k%M%S)20140626 95138

echo $(date +%Y%m%d%H%M%S)20140626095138

A data errada pode dar algo como:

echo "a" > myapp20140626 95138.log

onde é o seguinte o que seria desejado:

echo "a" > myapp20140626095138.log
AixNPanes
fonte
O erro é que você deve ter aspas em torno da variável, independentemente de ela conter espaços. Consulte Quando agrupar aspas em torno de uma variável de shell?
tripleee
5

O caminho especificado em $ {OUPUT_RESULTS} contém caracteres em branco? Nesse caso, considere usar... >> "${OUPUT_RESULTS}" (usar aspas).

(Você também pode considerar renomear sua variável para ${OUTPUT_RESULTS})

Thomas
fonte
1

Eu apenas tive esse erro em um script bash. O problema foi acidental \ no final da linha anterior que estava causando um erro.

Wayne Workman
fonte
1

Outra coisa que pode causar "redirecionamento ambíguo" está \t \n \rno nome da variável que você está escrevendo também

Talvez não \n\r? Mas erre por precaução

Tente isto

echo "a" > ${output_name//[$'\t\n\r']}

Fui atingido por este enquanto analisava HTML, Tabs \tno início da linha.

Jim
fonte
O erro não está citando a variável. Consulte Quando agrupar aspas em torno de uma variável de shell?
tripleee
1

Se o redirecionamento do seu script contiver uma variável e o corpo do script definir essa variável em uma seção entre parênteses, você receberá o erro "redirecionamento ambíguo". Aqui está um exemplo reproduzível:

  1. vim a.sh para criar o script
  2. editar script para conter (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
  3. chmod +x a.sh para torná-lo executável
  4. a.sh

Se você fizer isso, receberá "/home/ubuntu/a.sh: linha 1: $ logit: redirecionamento ambíguo". Isto é porque

"Colocar uma lista de comandos entre parênteses faz com que um subshell seja criado e cada um dos comandos na lista seja executado nesse subshell, sem remover variáveis ​​não exportadas. Como a lista é executada em um subshell, as atribuições de variáveis ​​não permanecem. em vigor após a conclusão do subshell ".

De Usando parênteses para agrupar e expandir expressões

Para corrigir isso, você pode modificar o script na etapa 2 para definir a variável fora dos parênteses: logit="/home/ubuntu/test.log" && (echo "a") >> $logit

enarmônico
fonte
0

se você estiver usando um nome de variável no comando shell, deverá concatená-lo com +sign.

por exemplo :

se você possui dois arquivos e não codifica o nome do arquivo, você deseja usar o nome da variável
"input.txt" = x
"output.txt" = y

then ('comando shell entre aspas' + x> + y)

funcionará dessa maneira, especialmente se você estiver usando isso dentro de um programa python com o comando os.system provavelmente

Anusree
fonte
0

Este pode ser o caso também.

você não especificou o arquivo em uma variável e redirecionou a saída para ele, o bash emitirá esse erro.

files=`ls`
out_file = /path/to/output_file.t
for i in `echo "$files"`;
do
    content=`cat $i` 
    echo "${content}  ${i}" >> ${out_file}
done

A variável out_file não está configurada corretamente, portanto, fique de olho nisso também. BTW, este código está imprimindo todo o conteúdo e seu nome de arquivo no console.

Rahul Rajput
fonte
0

Eu recebi esse erro ao tentar usar a expansão entre chaves para gravar a saída em vários arquivos.

por exemplo: echo "text" > {f1,f2}.txtresulta em-bash: {f1,f2}.txt: ambiguous redirect

Nesse caso, use teepara gerar vários arquivos:

echo "text" | tee {f1,f2,...,fn}.txt 1>/dev/null

o 1>/dev/nullirá impedir que o texto seja escrito para stdout

Se você deseja anexar ao (s) arquivo (s), use tee -a

espectro
fonte