簡體   English   中英

如何將標准輸入重定向到 bash 中的文件

[英]How to redirect stdin to file in bash

考慮這個非常簡單的 bash 腳本:

#!/bin/bash
cat > /tmp/file

它會將您通過管道輸入的任何內容重定向到文件。 例如

echo "hello" | script.sh

“你好”將在文件 /tmp/file.txt 中。 這有效......但似乎應該有一種不使用“cat”的本地bash方式來做到這一點。 但我想不通。

注意:

  1. 必須在腳本中。 我希望腳本之后對文件內容進行操作。

  2. 必須在一個文件中,在我的例子中之后的步驟涉及一個只能從文件中讀取的工具。

  3. 已經有一個很好的方法來做到這一點 - 只是它看起來像一個黑客。 本土的方式嗎? 像“/tmp/file < 0”或“0> /tmp/file”。 我認為 bash 會有一個本機語法來做到這一點......

你可以簡單地做

cp /dev/stdin  myfile.txt

使用 Ctrl+D 或 Ctrl+Z 終止您的輸入,中提琴! 您已經使用標准輸入中的文本創建了您的文件。

echo "$(</dev/stdin)" > /tmp/file

使用ENTER ctrl + d終止您的輸入

我不認為有一個從 stdin 讀取到 EOF 的內置函數,但你可以這樣做:

#!/bin/bash
exec > /tmp/file
while IFS= read -r line; do
  printf '%s\n' "$line"
done

另一種使用純 BASH 的方法:

#!/bin/bash

IFS= read -t 0.01 -r -d '' indata

[[ -n $indata ]] && printf "%s" "$indata" >/tmp/file

IFS=-d ''導致所有標准輸入數據被讀入變量indata

使用-t 0.01原因:當在沒有輸入管道的情況下調用此腳本時, read將在可忽略的0.01秒延遲后超時。 如果輸入中有任何可用數據,它將在indata變量中讀取,並將被重定向到>/tmp/file

另一種選擇: dd of=/tmp/myfile/txt

注意:不是內置的,但是,它可能會幫助其他人尋找簡單的解決方案。

你為什么不只是

GENERATE INPUT | (
    # do whatever you like to the input here
)

但有時,尤其是想先完成輸入,再對修改后的輸出進行操作時,還是應該使用臨時文件:

TMPFILE="/tmp/fileA-$$"
GENERATE INPUT | (
    # modify input
) > "$TMPFILE"
(
     # do something with the input from TMPFILE
) < "$TMPFILE"
rm "$TMPFILE"

如果您不希望程序在到達 EOF 后結束,這可能會有所幫助。

#!/bin/bash
exec < <(tail -F /tmp/a)
cat -

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM