如何在stash

时间:2016-03-30 15:38:26

标签: bash

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

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

它将管道中的任何内容重定向到文件。 e.g。

echo "hello" | script.sh

和“hello”将在文件/ tmp / file中。这有效...但似乎应该有一个本地bash方式这样做而不使用“猫”。但我无法理解。

注意:

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

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

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

7 个答案:

答案 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 -