我已经读过echo上的手册页,它告诉我-e参数将允许转义字符(例如换行符的转义n)具有其特殊含义。当我输入命令
时$ echo -e 'foo\nbar'
进入交互式bash shell,我得到了预期的输出:
foo
bar
但是当我使用同样的命令时(我已尝试将此命令字符作为测试用例)我得到以下输出:
-e foo
bar
就好像echo将-e解释为一个参数(因为换行符仍然显示),而且它还将-e解释为要回显的字符串。这里发生了什么?如何防止-e出现?
答案 0 :(得分:33)
您需要使用#!/bin/bash
作为脚本的第一行。如果不这样做,或者使用#!/bin/sh
,则该脚本将由Bourne shell运行,其echo
无法识别-e
选项。通常,如果可移植性很重要,建议所有新脚本使用printf
而不是echo
。
在Ubuntu中,sh
由/bin/dash
的符号链接提供。
答案 1 :(得分:4)
echo
的不同实现以令人烦恼的不同方式表现。有些人不接受选项(即只是如你所描述的那样回显-e
)并自动解释其参数中的转义序列。有些采用标记,除非给出-e
标记,否则不解释转义。有些采用标记,并根据是否传递-e
标志来解释不同的转义序列。如果你试图让它们以可预测的方式表现出来,有些会让你撕掉你的头发......哦,等等,这就是所有这些。
您在这里看到的内容是echo
与bash
中内置的/bin/echo
版本之间的差异,或者与其他shell内置版本相比可能存在差异。当Mac OS X v10.5附带一个内置echo
的bash内置printf
时,这就是我的回应标志,不像我的所有脚本所期望的那样......
无论如何,有一个解决方案:改用%
。它总是在第一个参数(格式字符串)中解释转义序列。问题在于它不会自动添加换行符(因此您必须记住明确地执行此操作),并且它还在其第一个参数(它毕竟是格式字符串)中解释%
个序列。通常,您希望将所有格式化内容放在格式字符串中,然后将变量字符串放在其余参数中,以便您可以控制它们的解释方式,您可以使用哪种printf "foo\nbar\n" # this does what you're trying to do in the example
printf "%s\n" "$var" # behaves like 'echo "$var"', except escapes will never be interpreted
printf "%b\n" "$var" # behaves like 'echo "$var"', except escapes will always be interpreted
printf "%b\n" "foo\nbar" # also does your example
格式将它们插入到输出中。一些例子:
{{1}}
答案 2 :(得分:1)
使用
别名echo / usr / bin / echo
强制'echo'调用解释'-e'参数的coreutils'回声。
答案 3 :(得分:0)
试试这个:
import subprocess
def bash_command(cmd):
subprocess.Popen(['/bin/bash', '-c', cmd])
code="abcde"
// you can use echo options such as -e
bash_command('echo -e "'+code+'"')
来源:http://www.saltycrane.com/blog/2011/04/how-use-bash-shell-python-subprocess-instead-binsh/