echo输出-b参数在bash脚本中。我怎么能阻止这个?

时间:2010-12-14 04:26:25

标签: bash echo

我已经读过echo上的手册页,它告诉我-e参数将允许转义字符(例如换行符的转义n)具有其特殊含义。当我输入命令

$ echo -e 'foo\nbar'

进入交互式bash shell,我得到了预期的输出:

foo
bar

但是当我使用同样的命令时(我已尝试将此命令字符作为测试用例)我得到以下输出:

-e foo
 bar

就好像echo将-e解释为一个参数(因为换行符仍然显示),而且它还将-e解释为要回显的字符串。这里发生了什么?如何防止-e出现?

4 个答案:

答案 0 :(得分:33)

您需要使用#!/bin/bash作为脚本的第一行。如果不这样做,或者使用#!/bin/sh,则该脚本将由Bourne shell运行,其echo无法识别-e选项。通常,如果可移植性很重要,建议所有新脚本使用printf而不是echo

在Ubuntu中,sh/bin/dash的符号链接提供。

答案 1 :(得分:4)

echo的不同实现以令人烦恼的不同方式表现。有些人不接受选项(即只是如你所描述的那样回显-e)并自动解释其参数中的转义序列。有些采用标记,除非给出-e标记,否则不解释转义。有些采用标记,并根据是否传递-e标志来解释不同的转义序列。如果你试图让它们以可预测的方式表现出来,有些会让你撕掉你的头发......哦,等等,这就是所有这些。

您在这里看到的内容是echobash中内置的/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/