Como fazer um tubo de script de shell ciente -- and-line campo com scripts campo com pipe campo com sh campo com dash-shell camp askubuntu Relacionado O problema

How to make a shell script pipe aware


-2
vote

problema

português

Eu tenho o seguinte script:

  #!/bin/sh  [ "${#}" -eq "0" ] && (printf "%s\n" "${0}: word ..." >&2; exit 1)  _whats() {     [ -z "${1}" ] && return 1     [ -z "${2}" ] && more_than_one="1"      for word; do         response="$(dig +short txt ${word}.wp.dg.cx)"         printf "%s\n" "${response}"         if [ -z "${more_than_one}" ]; then             printf "\n%s\n\n" ":::::::::::::::::::::::::::::::::::::::::"         fi     done }  _whats "${@}"    

Funciona ótimo quando eu chamo assim:

  whats shell script dns #it ouputs two definitions (shell script and dns)    

No entanto, eu também para chamá-lo desta maneira:

  echo shell script dns | whats    

Eu estou apenas acostumado com isso, todos os outros comandos Unix podem fazer isso, como você o implementaria em um script de shell?

english

I have the following script:

#!/bin/sh  [ "${#}" -eq "0" ] && (printf "%s\\n" "${0}: word ..." >&2; exit 1)  _whats() {     [ -z "${1}" ] && return 1     [ -z "${2}" ] && more_than_one="1"      for word; do         response="$(dig +short txt ${word}.wp.dg.cx)"         printf "%s\\n" "${response}"         if [ -z "${more_than_one}" ]; then             printf "\\n%s\\n\\n" ":::::::::::::::::::::::::::::::::::::::::"         fi     done }  _whats "${@}" 

It works great when I call it this way:

whats shell\ script dns #it ouputs two definitions (shell script and dns) 

However I'd also to call it this way:

echo shell\ script dns | whats 

I'm just used to it, all other unix commands can do it, how would you implement it in a shell script?

              
         
         

Lista de respostas

0
 
vote
vote
Melhor resposta
 

Depois de ler as seguintes referências:

  • https : //unix.stackexchange.com/questions/61183/bash-script-that-reads-filenames-from-a-pipe-or-from-command-line-args
  • http://www.luxjournal.com/content/working-stdin -E-stdout
  • http: // mockingye.com/blog/2013/01/22/reading-eDeThing-stdin-in-a-bash-script/

Eu editei o script acima da seguinte forma:

  sudo -s3   

que concatenará args + stdin em $ @, então agora funcionará nos seguintes cenários:

  sudo -s4   

Parse corretamente espaços com eles vieram como args

  sudo -s5   

mas não quando esses parâmetros são passados ​​através de um tubo:

  sudo -s6   

No entanto, isso é um problema que outros utilitários UNIX também têm (-print0, -0, etc), para que eu possa viver com ele.

 

After reading the following references:

  • https://unix.stackexchange.com/questions/61183/bash-script-that-reads-filenames-from-a-pipe-or-from-command-line-args
  • http://www.linuxjournal.com/content/working-stdin-and-stdout
  • http://mockingeye.com/blog/2013/01/22/reading-everything-stdin-in-a-bash-script/

I've edited the above script as follows:

#!/bin/sh  if [ ! -t 0 ]; then     #there is input comming from pipe or file, add to the end of $@     set -- "${@}" $(cat) fi  [ "${#}" -eq "0" ] && (printf "%s\\n" "${0}: word ..." >&2; exit 1)  _whats() {     [ -z "${1}" ] && return 1     [ -z "${2}" ] && more_than_one="1"      for word; do         response="$(dig +short txt ${word}.wp.dg.cx)"         printf "%s\\n" "${response}"         if [ -z "${more_than_one}" ]; then             printf "\\n%s\\n\\n" ":::::::::::::::::::::::::::::::::::::::::"         fi     done }  _whats "${@}" 

Which will concatenate args + stdin in $@, so now it will work in the following scenarios:

whats dns script #it outputs two definitions echo dns script | whats #same outputs as above echo dns script | whats ip #outputs ip, dns and script definition in that order 

It will parse correctly spaces with they came as args

whats shell\ script dns #output two definitions 

But not when those parameters are passed through a pipe:

echo shell\ script dns | whats #output three definitions 

However that's a problem other unix utilities have too (-print0, -0, etc), so I can live with it.

 
 

Perguntas relacionadas

3  Como substituir / corrigir um confuso / bin / sh e / bin / traço  ( How to replace fix a messed up bin sh and bin dash ) 
Eu corrupei meu / bin / sh e não tenho ideia de como substituí-lo. Eu acidentalmente copiei sobre isso. Como posso consertar isso? Eu estou executando o Ubu...

0  Erro fatal de shell de peixe: não um repositório Git  ( Fish shell fatal error not a git repository ) 
Eu tenho usado shell de peixe por um tempo agora, no entanto, um dia ou dois atrás, este erro começou aparecendo na execução de cada comando dentro do shell...

4  FC construído em falta do traço (isto é, o Histórico de Dash Shell não funciona)?  ( Fc built in missing from dash i e dash shell history doesnt work ) 
em ABCDEFGHIJKLMNABCDEFGHIJKLMBCDefGHIJKLMN2 Manual, em ABCDEFGHIJKLMNABCDefGHIJKLMN4 Existe Existe Explicação sobre ABCDEFGHIJKLMNABCDEFGHIJKLMN4 Const...

1  / bin / sh, / bin / bash e / bin / traço tudo quebrado, como posso instalá-los novamente  ( Bin sh bin bash and bin dash all broken how can i install them again ) 
Removido todos /bin/sh , /bin/bash e /bin/dash . Eu não posso instalá-los porque dpkg e apt-get precisa de um shell para instalar e não há shell dispo...

1  Quer pesquisar a ocorrência da string "Erro" em um arquivo de log, exceto em algumas cordas que tenham "erro" (devemos ignorar essas cadeias)  ( Want to search occurance of error string in a log file except in some strings ) 
Eu quero procurar uma ocorrência de "erro" no arquivo de log usando se a condição e imprimir esse erro estiver presente no arquivo de log. E se não estiver pr...

3  Como faço para usar argumentos de linha de comando para 'sh` na seqüência de comando `-c`?  ( How do i use command line arguments to sh in the c command string ) 
Eu sei que sh -c 'echo $1' sh 4 Vai produzir 4 . e sh -c 'echo $2' sh 4 5 irá produzir 5 . Mas não consigo entender como os parâmetros após ...

10  Como funciona? [duplicado]  ( How does work ) 
. Esta pergunta já tem respostas aqui : como usar o trabalho til como um atalho para o meu diretório ...

1  Como faço para escrever um script para renomear e mover um arquivo de vídeo?  ( How do i write a script to rename and move a video file ) 
no meu servidor de mídia eu tenho arquivos que eu quero mover e renomear automaticamente depois de terem sido assistidos (/ newepartes) Eu quero mover esses a...

0  O que é um exemplo de um script de shell genérico que será executado corretamente no terminal, mas não quando clicou duas vezes?  ( What is an example of a generic shell script that will run correctly in the term ) 
Eu realmente gostaria de entender as razões subjacentes pelas quais alguns scripts trabalham na linha de comando, mas não quando clicou duas vezes. Existe u...

0  Combine JPG e MP3 para MP4 usando Filemanager-Ações e Script Shell (Ubuntu 18.04)  ( Combine jpg and mp3 to mp4 using filemanager actions and shell script ubuntu 18 ) 
O que eu tento alcançar: Expandindo meu menu de contexto nautilus por uma ação para simplesmente selecionar um arquivo JPG e um arquivo mp3 para combiná-los...




© 2022 pergunte.org All Rights Reserved. Casa de perguntas e respostas todos os direitos reservados


Licensed under cc by-sa 3.0 with attribution required.