作为练习,是否存在将字符串重定向到没有echo的文件的方法?目前我正在使用
echo "Hello world" > test.txt
我了解cat
和printf
。我在想像
> test.txt <<<"Hello world"
当然这不起作用,但也许是一个类似的命令?
答案 0 :(得分:54)
您可以使用“cat”和here-document执行此操作。
cat <<EOF > test.txt
some text
EOF
这样做的一个原因是为了避免在ps的输出中出现密码的可能性。但是,在bash和大多数现代shell中,“echo”是一个内置命令,它不会显示在ps输出中,所以使用这样的东西是安全的(当然,忽略了将密码存储在文件中的任何问题):
echo "$password" > test.txt
答案 1 :(得分:14)
我遇到了无法发送“&gt;”的问题并以回声结束!
echo "Hello world" | dd of=test.txt
答案 2 :(得分:3)
有很多方法可以讨论你可能不关心的事情。你当然可以破解 - strace bash,或者在gdb中运行各种黑魔法运行Bash。
你实际上有两个完全不同的例子。 <<<'string'
已经将字符串写入文件。如果除printf
,echo
和cat
之外的任何其他内容都可以接受,您可以使用许多其他命令来表现得像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
答案 3 :(得分:3)
在bash中执行此操作的方法是
zsh <<< '> test <<< "Hello World!"'
这是zsh和bash之间有趣的区别之一:给定一个未链接的>
或>>
,zsh具有将其连接到stdin的良好意义,而bash则没有。这将是非常有用的 - 如果它只是标准的。
我试着用它来发送&amp;将我的ssh密钥添加到ssh到远程authorized_keys
文件,但远程主机当然是bash,并且悄悄地什么也没做。
这就是为什么你应该使用cat
。
答案 4 :(得分:3)
awk ' BEGIN { print "Hello, world" } ' > test.txt
会这样做
答案 5 :(得分:2)
只有重定向不起作用,因为没有任何东西可以连接现在打开的文件描述符。所以不,没有这样的方式。
答案 6 :(得分:1)
我为bash纯粹主义者提供了解决方案。
功能&#39;定义&#39;帮助我们为变量分配多行值。 这个采用一个位置参数:变量名称来赋值。
在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"
很幸运!
答案 7 :(得分:0)
有多种方法可以执行此操作,让我们运行名为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
答案 8 :(得分:0)
有趣的是,我也有这个问题...所以我搜索并找到了这个线程...。我发现这对我来说很有效:
echo "Hello world" | grep "" > test.txt
但是-当我关闭那个终端并打开一个新终端时,我发现问题消失了!我希望我保持该终端处于打开状态以比较设置。我当前的终端是bash shell。不知道是什么导致了这个问题的开始-任何人?