我正在使用Linux Ubuntu,我想用着色复制终止的当前路径。从本质上讲,我希望我的程序能够打印\u@\h:\w$
(user)@(host):(pwd)$
帖子,其中包含用户终端的颜色。换句话说,准确地将system("\u@\h:\w$ ")
的路径复制到着色。
我遇到两个问题:
1)我正在尝试使用{{1}},但无论我做什么,我都无法逃避特殊角色。
2)我找不到用户使用的颜色。
答案 0 :(得分:1)
这里几乎没有问题
解析PS1
环境变量由shell完成。 Shell(例如bash)将'\ u'字符串转换为'(user)'。这不是系统调用
System调用执行文件名,因此执行system("\u@\h:\w$ ")
时,您需要执行名为\u@\h:\w$
的程序。我不认为你的系统上有这样的程序,这不是你的意图。您想打印当前记录的用户名,而不是执行名为'\ u'的程序。您想执行名为whoami的程序,该程序将打印当前用户的用户名
我不知道你想要什么颜色。 unix shell中的着色是使用ANSI escape codes完成的。你只需打印一堆字符,你的终端就会为所有后续字符着色
使用C程序打印这个确切的输出比这更复杂,无论如何挑战等待。以下程序将打印(user)@(host):(pwd)$
的输出。部分(user)@
将为红色,部分(host):
将为黄色,部分(pwd)$
将为品红色。我正在使用popen posix调用来执行一个进程并获得它的输出。
#define _GNU_SOURCE
#include <unistd.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#define ANSI_COLOR_RED "\x1b[31m"
#define ANSI_COLOR_GREEN "\x1b[32m"
#define ANSI_COLOR_YELLOW "\x1b[33m"
#define ANSI_COLOR_BLUE "\x1b[34m"
#define ANSI_COLOR_MAGENTA "\x1b[35m"
#define ANSI_COLOR_CYAN "\x1b[36m"
#define ANSI_COLOR_RESET "\x1b[0m"
void exec_and_grab_output(const char cmd[], char *outbuf, size_t outbuflen) {
size_t outbufpos = 0;
FILE *fp;
char tmpbuf[100];
/* Open the command for reading. */
fp = popen(cmd, "r");
assert(fp != NULL);
/* Read the output a line at a time - output it. */
while (fgets(tmpbuf, sizeof(tmpbuf)-1, fp) != NULL) {
assert(outbufpos <= outbuflen);
const size_t tmpbufpos = strlen(tmpbuf);
memcpy(&outbuf[outbufpos], tmpbuf, tmpbufpos);
outbufpos += tmpbufpos;
}
/* close */
pclose(fp);
}
int main()
{
char outbuf[2048];
exec_and_grab_output("whoami", outbuf, sizeof(outbuf));
printf(ANSI_COLOR_RED);
assert(strlen(outbuf) > 2);
outbuf[strlen(outbuf)-2] = '\0'; // remove newline from output
printf("%s@", outbuf); // this will be red
exec_and_grab_output("hostname", outbuf, sizeof(outbuf));
printf(ANSI_COLOR_YELLOW);
assert(strlen(outbuf) > 2);
outbuf[strlen(outbuf)-2] = '\0'; // remove newline from output
printf("%s:", outbuf); // this will be yellow
exec_and_grab_output("pwd", outbuf, sizeof(outbuf));
printf(ANSI_COLOR_MAGENTA);
assert(strlen(outbuf) > 2);
outbuf[strlen(outbuf)-2] = '\0'; // remove newline from output
printf("%s$", outbuf); // this will be in magenta
printf(ANSI_COLOR_RESET);
return 0;
}
如果要在shell中为PS1变量的输出着色(不是在C中,C是编程语言,shell是程序),您可以在bash终端中输入:
export PS1="\033[31m\u@\033[33m\h:\033[36m\w$\033[0m"
\033[31m
部分与上面C程序中"\x1b[31m"
部分的1:1对应。 Bash会将\033[31m
个字符打印到终端(当打印PS1时),然后终端会将所有后续字符颜色变为红色。 Bash会将\u
扩展为当前用户的名称。等等。