57

作为练习,是否存在将字符串重定向到没有回显的文件的方法?目前我正在使用

echo "Hello world" > test.txt

我知道catprintf。我在想类似的东西

> test.txt <<<"Hello world"

当然这不起作用,但也许是一个类似的命令?

4

9 回答 9

77

您可以使用“cat”和此处的文档来执行此操作。

cat <<EOF > test.txt
some text
EOF

这样做的一个原因是避免密码在 ps 的输出中可见的任何可能性。然而,在 bash 和大多数现代 shell 中,“echo”是一个内置命令,它不会出现在 ps 输出中,所以使用这样的东西是安全的(当然,忽略在文件中存储密码的任何问题):

echo "$password" > test.txt
于 2013-03-05T16:49:12.887 回答
20

我遇到了无法发送“>”的问题,并以 echo 告终!

echo "Hello world" | dd of=test.txt
于 2013-08-09T12:40:38.763 回答
6

有多种方法可以做到这一点,让我们运行这个名为exercise.sh

#!/usr/bin/env bash

> file1.txt cat <<< "This is a here-string with random value $RANDOM"

# Or if you prefer to see what is happening and write to file as well
tee file2.txt <<< "Here is another here-string I can see and write to file"

# if you want to work multiline easily
cat <<EOF > file3.txt
You don't need to escape any quotes here, $ marks start of variables, unless escaped.
This is random value from variable $RANDOM
This is literal \$RANDOM
EOF

# Let's say you have a variable with multiline text and you want to manipulate it
a="
1
2
3
33
"

# Assume I want to have lines containing "3". Instead of grep it can even be another script
a=$(echo "$a" | grep 3)

# Then you want to write this to a file, although here-string is fine,
# if you don't need single-liner command, prefer heredoc
# Herestring. (If it's single liner, variable needs to be quoted to preserve newlines)
> file4.txt cat <<< "$a"
# Heredoc
cat <<EOF > file5.txt
$a
EOF

这是您应该看到的输出:

$ bash exercise.sh
Here is another here-string I can see and write to file

文件应包含以下内容:

$ ls
exercise.sh  file1.txt  file2.txt  file3.txt  file4.txt  file5.txt
$ cat file1.txt
This is a here-string with random value 20914
$ cat file2.txt
Here is another here-string I can see and write to file
$ cat file3.txt
You don't need to escape any quotes here, $ marks start of variables, unless escaped.
This is random value from variable 15899
This is literal $RANDOM
$ cat file4.txt
3
33
$ cat file5.txt
3
33
于 2017-07-21T14:41:11.133 回答
5

有太多的方法可以讨论,而你可能并不关心。你当然可以破解 - strace bash,或者在 gdb 中运行 Bash 做各种黑魔法。

你实际上有两个完全不同的例子。<<<'string'已经将字符串写入文件。如果除了 、 和 之外还有什么可以接受的printfechocat可以使用许多其他命令来表现得像 cat(sed、awk、tee 等)。

$ cp /dev/stdin ./tmpfooblah <<<'hello world'; cat tmpfooblah
hello world

或者地狱,这取决于你如何编译 Bash。

$ enable -f /usr/lib/bash/print print; print 'hello world' >tmpfile

如果您只想在纯 bash 中使用 bash 字符串和重定向,没有黑客攻击,也没有可加载项,这是不可能的。然而,在 ksh93 中,这是可能的。

 $ rm tmpfooblah; <<<'hello world' >tmpfooblah <##@(&!()); cat tmpfooblah
 hello world
于 2012-07-01T04:01:38.843 回答
4

在 bash 中执行此操作的方法是

zsh <<< '> test <<< "Hello World!"'

这是 zsh 和 bash 之间有趣的区别之一:给定一个未链接的>or >>,zsh 可以很好地将其连接到标准输入,而 bash 则没有。这将是非常有用的——如果它只是标准的话。我尝试使用它通过 ssh 发送和附加我的​​ ssh 密钥到远程authorized_keys文件,但是远程主机当然是 bash,并且悄悄地什么也没做。

这就是为什么你应该只使用cat.

于 2012-09-22T02:29:36.563 回答
3
awk ' BEGIN { print "Hello, world" } ' > test.txt

会做的

于 2012-12-05T05:48:31.393 回答
3

我有 bash 纯粹主义者的解决方案。

函数“定义”帮助我们将多行值分配给变量。这需要一个位置参数:分配值的变量名。

在 heredoc 中,也可以选择参数扩展!

#!/bin/bash

define ()
{
  IFS=$'\n' read -r -d '' $1
}

BUCH="Matthäus 1"

define TEXT<<EOT
Aus dem Buch: ${BUCH}

1 Buch des Geschlechts Jesu Christi, des Sohnes Davids, des Sohnes Abrahams.
2 Abraham zeugte Isaak; Isaak aber zeugte Jakob, Jakob aber zeugte Juda und seine Brüder;
3 Juda aber zeugte Phares und Zara von der Thamar; Phares aber zeugte Esrom, Esrom aber zeugte Aram,

4 Aram aber zeugte Aminadab, Aminadab aber zeugte Nahasson, Nahasson aber zeugte Salmon,
5 Salmon aber zeugte Boas von der Rahab; Boas aber zeugte Obed von der Ruth; Obed aber zeugte Isai,
6 Isai aber zeugte David, den König. David aber zeugte Salomon von der, die Urias Weib gewesen; 

EOT

define TEXTNOEXPAND<<"EOT" # or define TEXTNOEXPAND<<'EOT'
Aus dem Buch: ${BUCH}

1 Buch des Geschlechts Jesu Christi, des Sohnes Davids, des Sohnes Abrahams.
2 Abraham zeugte Isaak; Isaak aber zeugte Jakob, Jakob aber zeugte Juda und seine Brüder;
3 Juda aber zeugte Phares und Zara von der Thamar; Phares aber zeugte Esrom, Esrom aber zeugte Aram,


4 Aram aber zeugte Aminadab, Aminadab aber zeugte Nahasson, Nahasson aber zeugte Salmon,
5 Salmon aber zeugte Boas von der Rahab; Boas aber zeugte Obed von der Ruth; Obed aber zeugte Isai,
6 Isai aber zeugte David, den König. David aber zeugte Salomon von der, die Urias Weib gewesen; 

EOT

OUTFILE="/tmp/matthäus_eins"

# Create file
>"$OUTFILE"

# Write contents
{
   printf "%s\n" "$TEXT"
   printf "%s\n" "$TEXTNOEXPAND"
} >>"$OUTFILE" 

幸运!

于 2017-01-31T04:03:33.827 回答
2

只有重定向不起作用,因为没有任何东西可以连接现在打开的文件描述符。所以不,没有这样的方法。

于 2012-07-01T03:36:45.247 回答
1

有趣的是,我也遇到了这个问题......所以我搜索并找到了这个线程......我发现这对我很有效:

echo "Hello world" | grep "" > test.txt

但是- 当我关闭那个终端并打开一个新终端时,我发现问题消失了!我希望我一直打开那个终端来比较设置。我当前的终端是一个 bash shell。不知道是什么导致了这个问题的开始——有人吗?

于 2020-11-09T21:37:36.690 回答