我已经获得了在 Bash 中创建的脚本,我正在使用的函数之一是
echo
,并且我使用 -e
标志来解释 \
反斜杠转义。我有一个以彩色打印文本的脚本,但是当它回显将要以彩色显示的消息时,它还会打印带有消息的 -e
标志
此处为示例;
NC='\033[31;0m\' # no colors or formatting
RED='\033[0;31;1m\' # print text in bold red
PUR='\033[0;35;1m\' # print text in bold purple
YEL='\033[0;33;1m\' # print text in bold Yellow
GRA='\033[0;37;1m\' # print text in bold Gray
echo -e "This ${YEL}Message${NC} has color\nwith ${RED}new${NC} lines.
输出:
-e This Message has color.
with new lines
如果我碰巧在 bash 脚本中运行另一个命令,我也会得到这个,即使它不应该。例如,在脚本中开始运行时使用
screen
运行。
\033[31;0m\033[0;31;1mscreen: not found
编辑**
详细说明我正在尝试做的事情;
#!/bin/sh
##
## Nexus Miner script
##
NC='\033[31;0m'
RED='\033[0;31;1m'
PUR='\033[0;35;1m'
YEL='\033[0;33;1m'
GRA='\033[0;37;1m'
ADDR="<wallet-address-goes-here"
NAME="<worker-name-goes-here>"
URL="nexusminingpool.com"
## check if user is root, if true, then exit with status 1, else run program.
if [ `whoami` = root ]; then
echo -e "\n${PUR}You don't need ROOT for this!${NC}\n" 1>&2
exit 1;
## running Nexus Miner with Screen so you can run it in background
## and call it up at any time to check mining progress of Nexus CPU Miner.
else
echo -e "\n\n${YEL}Normal User?${NC} ${GRA}[OK]${NC}\n${GRA}Session running with${NC} ${RED}SCREEN${NC}${GRA}, Press${NC} ${RED}^C + A${NC} ${GRA}then${NC} ${RED}^C + D${NC} ${GRA}to run in background.${NC}\n${GRA}to resume enter `${NC}${RED}screen -r${NC}${GRA}` from Terminal.${NC}\n\n"
echo -e "${PUR}Nexus CPU Miner${NC}\n${GRA}Wallet Address:${NC} $ADDR\n${GRA}Worker Name:${NC} $NAME\n${GRA}CPU Threads:${NC} (Default: 2)\n\n"
## call strings for wallet address and worker name varibles followe by thread numbers (default: 2)
## run nexus cpu miner within screen so it can run in the background
`screen /home/user/PrimePoolMiner/nexus_cpuminer $URL 9549 $ADDR $NAME 2`
fi
您写道:“我已经获得了在 Bash 中创建的脚本”,但您没有确切地告诉我们您的意思。
更新:问题已更新。脚本的第一行是
#!/bin/sh
。请继续阅读以获取解释和解决方案。
我可以通过将您的代码包含在以
开头的脚本中来重现我的系统上的问题#!/bin/sh
我可以通过将第一行更改为
来纠正问题#!/bin/bash
我的系统上的 /bin/sh
恰好是 dash
的符号链接。 dash
shell 将 echo
作为内置命令,但它不支持 -e
选项。 #!
线,g othe
echo
命令有多种实现:大多数 shell 将其作为内置命令提供(具有各种功能,具体取决于 shell),并且可能有一个外部命令 /bin/echo
,其行为略有不同。
如果您希望打印除简单文本行之外的任何内容时保持一致的行为,我建议使用
printf
命令。请参阅 https://unix.stackexchange.com/questions/65803/why-is-printf-better-than-echo(由 Josh Lee 在评论中引用)。
#!
行,称为 shebang,控制使用哪个 shell 来执行脚本。您执行脚本的交互式 shell 是无关的。 (它几乎必须是这样;否则脚本对于不同的用户会有不同的行为)。在没有 #!
行的情况下,脚本(可能)将使用 /bin/sh
执行,但不明确没有多大意义。
删除结尾的反斜杠并添加结束引号:
NC='\033[31;0m' # no colors or formatting
RED='\033[0;31;1m' # print text in bold red
PUR='\033[0;35;1m' # print text in bold purple
YEL='\033[0;33;1m' # print text in bold Yellow
GRA='\033[0;37;1m' # print text in bold Gray
echo -e "This ${YEL}Message${NC} has color\nwith ${RED}new${NC} lines."
并且它在
bash
中按预期工作。
如果将此脚本保存到文件中,请像
bash <file>
一样运行它。
尝试
type -a echo
看看它是什么。输出的第一行应该是 echo is a shell builtin
:
$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo
以下方法也解决了前导的问题
-e
:
bash -c 'echo -e "This is a \x1b[31mred fragment\x1b[39m of text"'
...或使用您最初尝试的八进制文字(完全相同):
bash -c 'echo -e "This is a \033[31mred fragment\033[39m of text"'
当您想要从
-e
得到 echo
(使用 python
语句)时,可能会出现前导 os.popen('...').read()
的问题。 python代码中同样的效果:
import os
cmd_echo = """bash -c 'echo -e "This is a \x1b[31mred fragment\x1b[39m of text"'"""
print(f"... > {cmd_echo}")
print(os.popen(cmd_echo).read())
在所有描述的情况下,输出应为红色的
red fragment
。抱歉,不知道如何在这里打印:-(