我有一个包含大量echo
语句的 bash 脚本,并且我还将其别名echo
为echo -e
in.bash_profile
和.bashrc
,以便可以正确打印语句的新行,例如echo 'Hello\nWorld'
输出应该是
Hello
World
但我得到的输出是
Hello\nWorld
我甚至尝试shopt -s expand_aliases
在脚本中使用,但没有帮助
我正在运行我的脚本bash /scripts/scriptnm.sh
;如果我按如下方式运行它,. /scripts/scriptnm.sh
我会得到所需的输出......
答案1
的混合历史echo
意味着其默认操作因 shell 而异。POSIX指定echo
如果第一个参数是-n
或任何参数包含反斜杠,则结果是“实现定义的”。
使用更可靠printf
(作为内置命令或外部命令)其行为定义更明确:格式字符串(第一个参数)支持 C 风格的反斜杠转义和格式说明符。
printf 'foo\nbar\n'
printf '%s\n%s\n' foo bar
您可以控制反斜杠转义序列的扩展狂欢带有shell 选项echo
的内置命令xpg_echo
。
将其设置在任意狂欢脚本可以echo
自动扩展反斜杠转义符,而无需添加-e
到每个 echo 命令中。
shopt -s xpg_echo
echo 'foo\nbar'
答案2
建议的做法是用于printf
所有新脚本。
printf '%s\n%s\n' "Hello" "World"
printf '%s\n' "Hello\nWorld"
答案3
当你使用时bash myfile.sh
,Bash 以“批处理”模式运行,分离流程,以及才不是读取其配置文件或 rcfile。
当你使用时. myfile.sh
,该文件是来源由当前 shell 进程(就好像其内容是由您输入的),因此它可以看到您当前定义的别名。
一般来说,编写依赖于任何特定 shell 配置的脚本是一个非常糟糕的想法,尤其别名,除非你定义它们在脚本中本身。(绝不依赖于用户的.bashrc
,即使是你自己的。
答案4
这在终端上运行良好
#!/bin/bash
alias echo="echo -e"
echo "Hello\nWorld"
保存到文件并使其可执行(chmod +x)
作为 ./your_file 运行