在bash中回显打印-e

问题描述 投票:0回答:3

我已经获得了在 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 echo
3个回答
13
投票

您写道:“我已经获得了在 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
执行,但不明确没有多大意义。


3
投票

删除结尾的反斜杠并添加结束引号:

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

0
投票

以下方法也解决了前导的问题

-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
。抱歉,不知道如何在这里打印:-(

© www.soinside.com 2019 - 2024. All rights reserved.