echo -e 在SHELL脚本和命令行中表现不同一例问题排查

  一开发同事反馈,在SHELL脚本中使用echo -e 将结果输出到文件中,表现与预期不同,具体如下:
【echo 的man如下所示】

  开发同事在脚本中是这样调用他写的脚本的:

# vim a.sh

sh b.sh

【b.sh中包含echo -e操作】

  操作系统:ubuntu14.04
  脚本内容【示例】:

# cat test01.sh
#!/bin/bash

echo -e "aa\nbb" > /tmp/test.log

执行后,得到的/tmp/test.log 的内容为
# sh -x tesh01.sh
+ echo -e aa\nbb
# cat /tmp/test.log
-e aa
bb
# echo -e "aa\nbb" > /tmp/test.log
# cat /tmp/test.log
aa
bb

  可以看到使用sh 执行脚本与直接在shell 中运行该命令,可以看到结果不一样。sh执行的,虽然 -n也被转义了,但是文件中却多了一个-e
  看到这里,其实问题已经有点眉目了。接下来只需要做点小测试验证一下就行。首先,我们来对比一下sh -x 执行和直接在命令行中有何不同 ?
  可能有人已经想到了,执行的应用程序不一样,命令行中用的是bash【我本地使用的bash,也就是/bin/bash】,sh 使用的是/bin/sh 。
  那么为什么会不一样呢?
  来看一下两个文件

# ll /bin/bash
-rwxr-xr-x 1 root root 1021112 10月 8 2014 /bin/bash*
# ll /bin/sh
lrwxrwxrwx 1 root root 9 11月 7 20:16 /bin/sh -> /bin/dash*

  原因已经看到了,/bin/sh软连接并不是链接到/bin/bash。 至于是哪位同学改成这样的,这个暂时不去查了,只需要将软连接改回即可恢复正常。

# ln -sfn /bin/bash /bin/sh

原文地址:https://www.cnblogs.com/doctormo/p/12003275.html

时间: 2024-10-08 21:16:30

echo -e 在SHELL脚本和命令行中表现不同一例问题排查的相关文章

使用getopts命令解析shell脚本的命令行选项

转自:http://yejinxin.github.io/parse-shell-options-with-getopts-command/ 标准的Unix命令一般都提供很多选项,使用者通过命令行提供具体的选项和参数,格式如下: command -options parameters filename getopts是shell内建的一个命令,它可以帮助我们处理命令行选项,使得我们的脚本也可以与unix命令保持风格一致.getopts的用法格式为: getopts option_string v

shell脚本接收命令行参数

cd ~ && mkdir $1 && cd $1 && touch $2 && cvc-add --ticket $1 --module mfgpro_cust $2 && cvc-ci --ticket $1 --message 'ci' && cvc-report --promote-avail test $0是第一个参数,$1是第二个,以此类推 sh tmp.sh T-12 test12.p tmp.s

shell脚本实现命令行多级菜单(无具体功能)

#!/bin/bash #auth chentp0601 #date 20151123 function menu() { clear cat <<EOF #this is base menu 1.[install lamp] 2.[install lnmp] 3.[exit] EOF read -p "please input 1-3:" list case $list in "1") while true do menu_lamp done ;; &

shell脚本修改Linux系统中所有IP样例

#!/bin/sh CURR_DIR=$(cd $(dirname $0);pwd) TD_BASE=`su - tduser -c "echo "${TD_BASE}""` function change_app_ip() { if [ $# -ne 3 ];then echo "The param is not correct." exit 1 fi if [ "$1" != "app_ip" ];th

使用getopt命令解析shell脚本的命令行选项 【转】

本文转载自:http://yejinxin.github.io/parse-shell-options-with-getopt-command 在之前的一篇文章中,介绍了如何利用shell内置的getopts命令来帮助我们处理shell脚本选项和参数,其缺点是只能处理短选项,无法处理长选项.下面,本文将要介绍的是getopt命令,它可以同时处理短选项和长选项. 首先,getopt命令不是一个标准的unix命令,但它在大多数Linux的发行版中都自带了有,如果没有,也可以从getopt官网上下载安

shell脚本常用命令(HandBook_1)

shell及其他解释型语言的一般格式?  #!/bin/bash            #shell脚本的首行格式  #!/usr/bin/python  #python脚本的格式  #!/usr/bin/perl        #perl脚本的格式  #Description:      #"#"开头的单个井字号是注释符,其后内容不当做脚本程序执行  COMMAND            #脚本的编程内容部分,命令的堆砌,单一命令的组合完成复杂任务 怎样使得定义的变量生效? 1.~]

几种在shell命令行中过滤adb logcat输出的方法

我们在Android开发中总能看到程序的log日志内容充满了屏幕,而真正对开发者有意义的信息被淹没在洪流之中,让开发者无所适从,严重影响开发效率.本文就具体介绍几种在shell命令行中过滤adb logcat输出的方法. 1.只显示需要的输出(白名单) 最方便的当然是通过管道使用 grep 过滤了,这样可以使用 grep 强大的正则表达式匹配.简单的匹配一行当中的某个字符串,例如 MyApp: adb logcat | grep MyApp       adb logcat | grep -i

Linux Shell脚本Ldd命令原理及使用方法

1.首先ldd不是一个可执行程序,而只是一个shell脚本2.ldd能够显示可执行模块的dependency,其原理是通过设置一系列的环境变量如下:LD_TRACE_LOADED_OBJECTS.LD_WARN.LD_BIND_NOW.LD_LIBRARY_VERSION. LD_VERBOSE等.当LD_TRACE_LOADED_OBJECTS环境变量不为空时,任何可执行程序在运行时,它都会只显示模块的 dependency,而程序并不真正执行.要不你可以在shell终端测试一下,如下:(1)

mysql中如何在命令行中,执行一个SQL脚本文件?

需求描述: 在mysql数据库的使用中,有的时候,需要直接在shell的命令行中,执行某个SQL脚本文件, 比如,要初始化数据库,创建特定的存储过程,创建表等操作,这里进行一个基本的测试. 一般情况,mysql都是以交互式的方式登录,执行SQL语句的.这里要做的就是将SQL放在一个文件里,让mysql 客户端程序来执行. 操作过程: 1.创建一个SQL脚本的文本文件,里面放想要执行的SQL语句 use test01 select count(*) from ts051; 备注:SQL脚本的文件名