Bas*_*ser 14 linux script bash shell
我有有很多的bash脚本echo
语句,也是我别名echo
到echo -e
两个.bash_profile
及.bashrc
,使新线为语句正常打印一样echo 'Hello\nWorld'
的输出应该是
Hello
World
Run Code Online (Sandbox Code Playgroud)
但我得到的输出是
Hello\nWorld
Run Code Online (Sandbox Code Playgroud)
我什至尝试shopt -s expand_aliases
在脚本中使用,它没有帮助
我正在运行我的脚本bash /scripts/scriptnm.sh
;如果我. /scripts/scriptnm.sh
在获得所需的输出时运行它...
Chr*_*sen 20
混合历史echo
意味着它的默认操作因外壳而异。POSIX指定echo
如果第一个参数是-n
或任何参数包含反斜杠,则结果是“实现定义的” 。
printf
在行为更明确的情况下使用(作为内置命令或外部命令)更可靠:格式字符串(第一个参数)中支持 C 样式的反斜杠转义和格式说明符。
printf 'foo\nbar\n'
printf '%s\n%s\n' foo bar
Run Code Online (Sandbox Code Playgroud)
您可以控制的反斜杠转义序列扩张的bash的echo
内置命令与xpg_echo
外壳选项。
将它设置在任何bash脚本的顶部,以echo
自动展开反斜杠转义,而不必添加-e
到每个 echo 命令。
shopt -s xpg_echo
echo 'foo\nbar'
Run Code Online (Sandbox Code Playgroud)
推荐的做法是printf
用于所有新脚本。
printf '%s\n%s\n' "Hello" "World"
printf '%s\n' "Hello\nWorld"
Run Code Online (Sandbox Code Playgroud)
当您使用 时bash myfile.sh
,Bash 以“批处理”模式在单独的进程中运行,并且不会读取其配置文件或 rcfile。
当您使用. myfile.sh
,该文件来源由当前shell进程(好像它的内容是由你输入),所以它看到您的当前定义的别名。
一般来说,编写依赖于任何特定 shell 配置的脚本是一个非常糟糕的主意,尤其是别名,除非您在脚本本身中定义它们。(永远不要依赖用户的.bashrc
,即使它是你自己的。)
归档时间: |
|
查看次数: |
43184 次 |
最近记录: |