考虑这个非常简单的bash脚本:
#!/bin/bash
cat > /tmp/file
它将管道中的任何内容重定向到文件。 e.g。
echo "hello" | script.sh
和“hello”将在文件/ tmp / file中。这有效...但似乎应该有一个本地bash方式这样做而不使用“猫”。但我无法理解。
注意:
必须在脚本中。我想让脚本在之后对文件内容进行操作。
必须在一个文件中,在我的情况下,后面的步骤涉及一个只能从文件中读取的工具。
我已经有一个非常好的方法 - 它只是看起来像一个黑客。是否有原生方式?像“/ tmp / file< 0”或“0> / tmp / file”。我认为bash会有一个原生语法来做这个......
答案 0 :(得分:15)
你可以简单地做
cp /dev/stdin myfile.txt
使用Ctrl + D或Ctrl + Z和中提琴终止输入!您使用stdin中的文本创建了文件。
答案 1 :(得分:7)
{{1}}
使用 ENTER ctrl + d
终止输入答案 2 :(得分:3)
使用纯BASH的另一种方法:
#!/bin/bash
IFS= read -t 0.01 -r -d '' indata
[[ -n $indata ]] && printf "%s" "$indata" >/tmp/file
IFS=
和-d ''
会将所有stdin数据读入变量indata
。
使用-t 0.01
的原因:如果在没有输入管道的情况下调用此脚本,则read
将在可忽略的0.01
秒延迟后超时。如果输入中有任何可用数据,则会在indata
变量中读取该数据,并将其重定向到>/tmp/file
。
答案 3 :(得分:2)
我不认为有一个内置函数从stdin读取到EOF,但你可以这样做:
#!/bin/bash
exec > /tmp/file
while IFS= read -r line; do
printf '%s\n' "$line"
done
答案 4 :(得分:0)
为什么不是
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"
答案 5 :(得分:0)
另一种选择:dd of=/tmp/myfile/txt
答案 6 :(得分:0)
如果您不希望程序在到达 EOF 后结束,这可能会有所帮助。
#!/bin/bash
exec < <(tail -F /tmp/a)
cat -