如何在stash中将stdin重定向到文件

Raf*_*sta 6 bash

考虑这个非常简单的bash脚本:

#!/bin/bash
cat > /tmp/file
Run Code Online (Sandbox Code Playgroud)

它将管道中的任何内容重定向到文件中.例如

echo "hello" | script.sh
Run Code Online (Sandbox Code Playgroud)

并且"hello"将位于文件/ tmp/file中.这有效...但似乎应该有一个本地bash方式这样做而不使用"猫".但我无法弄明白.

注意:

  1. 它必须在脚本中.我想让脚本在之后对文件内容进行操作.

  2. 它必须在一个文件中,在我的情况下,后面的步骤涉及一个只从文件中读取的工具.

  3. 我已经有了一个非常好的方法 - 它只是看起来像一个黑客.有原生方式吗?像"/ tmp/file <0"或"0>/tmp/file".我认为bash会有一个原生语法来做到这一点......

小智 20

你可以干脆做

cp /dev/stdin  myfile.txt
Run Code Online (Sandbox Code Playgroud)

使用Ctrl + D或Ctrl + Z和中提琴终止输入!您使用stdin中的文本创建了文件.

  • ...这很好,因为它允许您将该命令与其他 shell 一起使用。 (4认同)

cul*_*mat 9

echo "$(</dev/stdin)" > /tmp/file
Run Code Online (Sandbox Code Playgroud)

用ENTERctrl+ 终止你的输入d

  • 这将删除流中存在的任何NUL.它还将无条件地添加尾随换行符,无论输入中是否存在. (2认同)

for*_*cve 6

我不认为有一个内置函数可以从 stdin 读取直到 EOF,但你可以这样做:

#!/bin/bash
exec > /tmp/file
while IFS= read -r line; do
  printf '%s\n' "$line"
done
Run Code Online (Sandbox Code Playgroud)