我听说printf
比echo
. 根据我的经验,我只能回忆起一个我不得不使用的实例,printf
因为它echo
无法将一些文本输入到 RHEL 5.8 上的某个程序中,但printf
确实如此。但显然,还有其他差异,我想询问它们是什么以及是否有特定情况下何时使用一种与另一种。
如果我跑
export TEST=foo
echo $TEST
Run Code Online (Sandbox Code Playgroud)
它输出 foo。
如果我跑
TEST=foo echo $TEST
Run Code Online (Sandbox Code Playgroud)
它不是。如何在不使用导出或脚本的情况下获得此功能?
我正在尝试将我目录中所有 xml 文件的时间戳更新为当前时间(递归)。我使用的是 Mac OSX 10.8.5。
在大约 300,000 个文件上,以下echo
命令需要10 秒:
for file in `find . -name "*.xml"`; do echo >> $file; done
Run Code Online (Sandbox Code Playgroud)
但是,以下touch
命令需要10 分钟!:
for file in `find . -name "*.xml"`; do touch $file; done
Run Code Online (Sandbox Code Playgroud)
为什么这里的回声比触摸快得多?
我知道我可以删除最后三个字符:
echo -ne '\b\b\b'
Run Code Online (Sandbox Code Playgroud)
但是如何删除整行?我的意思是我不想使用:
echo -ne '\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b'
Run Code Online (Sandbox Code Playgroud)
...等...删除长行。
我有一个名为my_file.txt
的文件,其内容只是 string Hello
。如何将其内容重定向到命令echo
?
我知道我有命令less
, cat
, more
... 但我需要用echo
.
我试过这个:
$ cat my_file.txt | echo
Run Code Online (Sandbox Code Playgroud)
还有这个:
$ echo < my_file.txt
Run Code Online (Sandbox Code Playgroud)
但在这两种情况下,它在标准输出中只出现一个空白,而不是 my_file.txt 的内容。
我怎么能那样做?
我的印象是,单个参数的最大长度在这里不是问题,而是整个参数数组的总大小加上环境的大小(仅限于ARG_MAX
. 因此,我认为类似以下的事情会成功:
env_size=$(cat /proc/$$/environ | wc -c)
(( arg_size = $(getconf ARG_MAX) - $env_size - 100 ))
/bin/echo $(tr -dc [:alnum:] </dev/urandom | head -c $arg_size) >/dev/null
Run Code Online (Sandbox Code Playgroud)
这- 100
足以解释 shell 和echo
进程中环境大小之间的差异。相反,我收到了错误:
bash: /bin/echo: Argument list too long
Run Code Online (Sandbox Code Playgroud)
玩了一段时间后,我发现最大值小了一个完整的十六进制数量级:
/bin/echo \
$(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) \
>/dev/null
Run Code Online (Sandbox Code Playgroud)
当减一被删除时,错误返回。看似单个参数的最大值实际上是放置在参数数组中字符串末尾的空字节ARG_MAX/16
的-1
帐户。
另一个问题是,当参数重复时,参数数组的总大小可以接近ARG_MAX
,但仍然不完全:
args=( $(tr -dc [:alnum:] </dev/urandom | head -c $(($(getconf ARG_MAX)/16-1))) )
for x in {1..14}; …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 i2c 总线将我的 rasberry Pi 连接到某些显示器。首先,我想手动写入内容,特别是字节到文件。 如何将特定字节写入文件? 我已经读过那个,我认为我的问题应该通过这样的方式解决
echo -n -e \x66\x6f\x6f > byteFileForNow
Run Code Online (Sandbox Code Playgroud)
然而,当我打开了纳米该文件,而不是富我看到:
x66x6fx6f
所以反斜杠被转义了,而不是字节本身。这次我也只在没有-e 的情况下尝试了相同的方法,所以我本来希望看到\x66\x6f\x6f,但结果和以前一样。
因此,echo 正在转义反斜杠、单独的反斜杠和反斜杠,而不管它是否应该这样做。
知道如何解决这个问题吗?
根据应该已经完成我正在寻找的手册页。
为什么以下命令不会在生成的文件中插入新行,解决方案是什么?
$ echo "Line 1\r\nLine2" >> readme.txt
$ cat readme.txt
Line 1\r\nLine2
Run Code Online (Sandbox Code Playgroud) 我试图echo
通过将内容写入文件来创建脚本,而不是使用编辑器打开它
echo -e "#!/bin/bash \n /usr/bin/command args" > .scripts/command
Run Code Online (Sandbox Code Playgroud)
的输出:
bash: !/bin/bash: 事件未找到
我已将这种奇怪的行为与bang隔离开来。
$ echo !
!
$ echo "!"
bash: !: event not found
$ echo \#!
#!
$ echo \#!/bin/bash
bash: !/bin/bash: event not found
Run Code Online (Sandbox Code Playgroud)
我想使用 echo 命令和重定向运算符创建一个文件,该文件应该由几行组成。
我试图通过“\n”在字符串中包含一个换行符:
echo "first line\nsecond line\nthirdline\n" > foo
Run Code Online (Sandbox Code Playgroud)
但是这样不会创建三行文件,而是创建一个只有一行和字符串的逐字内容的文件。
如何仅使用此命令创建多行文件?