[英]How to redirect stdin to file in bash
考慮這個非常簡單的 bash 腳本:
#!/bin/bash
cat > /tmp/file
它會將您通過管道輸入的任何內容重定向到文件。 例如
echo "hello" | script.sh
“你好”將在文件 /tmp/file.txt 中。 這有效......但似乎應該有一種不使用“cat”的本地bash方式來做到這一點。 但我想不通。
注意:
它必須在腳本中。 我希望腳本之后對文件內容進行操作。
它必須在一個文件中,在我的例子中之后的步驟涉及一個只能從文件中讀取的工具。
我已經有一個很好的方法來做到這一點 - 只是它看起來像一個黑客。 有本土的方式嗎? 像“/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.