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.
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.
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:
vim a.sh para criar o script
editar script para conter (logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh para torná-lo executável
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 ".
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
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.
${OUPUT_RESULTS}
. Seu também um erro de ortografia, se você quis dizer$OUTPUT_RESULTS}
OUPUT_RESULTS = "filename.log"
receberá um redirecionamento ambíguo. Porque o bash não precisa de espaço ao redor do=
operador.Respostas:
Bash pode ser bastante obtuso às vezes.
Os seguintes comandos retornam mensagens de erro diferentes para basicamente o mesmo erro:
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.
fonte
sh -c 'echo hello >/tmp/hello' >/tmp/world
funciona corretamente.Você tem uma variável chamada
OUPUT_RESULTS
ou é mais provávelOUTPUT_RESULTS
?fonte
ABC="junk file.txt"
, isso ainda teria o problema.coloque aspas em torno de sua variável. Se houver espaços, ele também fornecerá "redirecionamento ambíguo". verifique também a ortografia
por exemplo, de redirecionamento ambíguo
fonte
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).log
e especificar os caracteres de formatação incorretos, o redirecionamento falhará antes das 10h, por exemplo. Se, no entanto, você usouapplication$(date +%Y%m%d%H%M%S).log
, teria sucesso. Isso ocorre porque o%k
formato gera' 9'
9h, onde%H
gera'09'
9h.echo $(date +%Y%m%d%k%M%S)
dá20140626 95138
echo $(date +%Y%m%d%H%M%S)
dá20140626095138
A data errada pode dar algo como:
onde é o seguinte o que seria desejado:
fonte
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}
)fonte
Eu apenas tive esse erro em um script bash. O problema foi acidental \ no final da linha anterior que estava causando um erro.
fonte
Outra coisa que pode causar "redirecionamento ambíguo" está
\t
\n
\r
no nome da variável que você está escrevendo tambémTalvez não
\n\r
? Mas erre por precauçãoTente isto
Fui atingido por este enquanto analisava HTML, Tabs
\t
no início da linha.fonte
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:
vim a.sh
para criar o script(logit="/home/ubuntu/test.log" && echo "a") >> ${logit}
chmod +x a.sh
para torná-lo executávela.sh
Se você fizer isso, receberá "/home/ubuntu/a.sh: linha 1: $ logit: redirecionamento ambíguo". Isto é porque
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
fonte
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
funcionará dessa maneira, especialmente se você estiver usando isso dentro de um programa python com o comando os.system provavelmente
fonte
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.
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.
fonte
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}.txt
resulta em-bash: {f1,f2}.txt: ambiguous redirect
Nesse caso, use
tee
para gerar vários arquivos:o
1>/dev/null
irá impedir que o texto seja escrito para stdoutSe você deseja anexar ao (s) arquivo (s), use
tee -a
fonte