Relacionado a uma pergunta que fiz no Stack Overflow: Passando várias linhas de código para o wsadmin.sh? .
Eu tenho, como uma string, algumas linhas de entrada que eu preciso alimentar em um comando. O comando, no entanto, aceita apenas um arquivo cheio de entrada.
Existe alguma maneira de armazenar as linhas em um arquivo ou canal temporário que nunca é realmente gravado em disco e depois alimentá-lo diretamente no programa?
Como faço para adquirir o tubo, alimentar a entrada dele, passar o tubo para o comando e depois me livrar do tubo?
linux
command-line
bash
ArtOfWarfare
fonte
fonte
Respostas:
Outra solução é usar a Substituição de Processo no Bash. Se o seu sistema tiver nomeado pipes, você poderá usar esse recurso.
É usado assim:
Onde
list
está uma sequência de comandos do shell (na verdade pipelines; os detalhes completos estão aqui ).list
será executado e sua saída será conectada ao tubo. O nome do canal é passado para o seu programa.NOTA: não são permitidos espaços entre
<
e(
.(A outra substituição
>(list)
também funciona como você esperaria.)No seu caso específico, você pode usar
embora você possa achar a solução do @ meuh mais elegante.
Atualização: Muitos exemplos de uso podem ser encontrados no Advanced Bash Scripting Guide .
fonte
Você pode usar um documento aqui do bash . Por exemplo,
Se você tem algo em uma variável bash, também pode interpolar: por exemplo
<<<"path is $PATH"
.Se o seu comando insistir em um nome de arquivo, você poderá atribuí-lo
/dev/stdin
. Por exemplo:produz a saída:
s/b/b/
.fonte
stdin
e, se não, isso não vai funcionar. Espero que o OP esclareça."-f" option must be followed by a file name.
-f
e um nome de arquivo, forneça o nome do arquivo/dev/stdin
. Veja minha edição./dev/stdin
sugestão. O programa que estou tentando chamar aceita apenas um nome de arquivo, então combinei/dev/stdin
com um heredoc.Dependendo do conteúdo do script, você poderá usar o nome de arquivo especial - (menos), que significa stdin
Outro método que pode funcionar para você é abrir o arquivo
/dev/fd/0
que novamente significa stdin .Uma terceira opção pode ser criar um FIFO (primeiro a entrar, primeiro a sair). Isso é como um arquivo, mas tem duas extremidades - você escreve em uma extremidade e lê na outra.
fonte
-
dessa maneira - não é um recurso do shell ou do sistema operacional. Embora, é claro, a maioria dos utilitários padrão do Linux siga esta convenção, tanto quanto eu sei.expect
.<()
solução, mas mais explícitas - o que pode ser muito útil!Há outra opção semelhante à
mycmd -
solução, mas mesmo para programas que não tratam-
especificamente:/dev/stdin
parece estar relacionado ao sistema operacional e funciona para mim no Debian GNU / Linux, mas não tenho certeza de onde mais ele funcionará.fonte
^D
?^D
é uma notação comum para pressionar Ctrl-D. ^ D tem a semântica de "fim do fluxo de entrada" aqui. Provavelmente é visto com mais frequência^C
ou^Z
que significa pressionar Ctrl-C, respectivamente, pressionando Ctrl-Z./dev/stdin
e depois as fecharia?cat content | mycmd /dev/stdin
. Imagine comandos diferentes do quecat
aqui.