linux time 的重定向

本文介绍了在RedHat9中实现标准错误输出重定向的几种方法,并详细解释了如何正确使用这些方法来捕获time命令的输出。

发现 redhat 9 标准错误输出重定向的三种写法。假设当前目录存在y文件,不存在x

 

$cat x y >& c1

$cat x y &> c2

$cat xy >c3 2>&1

 

c1 c2 c3 内容都一样,包括错误输出。

 

time是运行一条命令,然后在标准错误输出上报告使用的时间。但是time输出的重定向还真费了点功夫。。

 

如果这样 $ time ls > c4 2>&1  ;结果time的输出还是显示在终端。

这样就ok啦:

${ time ls;}  >c5 2>&1

{}内第一个字母前一定要空格,要加分号。

这样全部输出都放到c5里边了……

Linux 系统中,如果你想将 `printf` 打印的内容重定向到日志文件中(比如 `/var/log/myapp.log`),可以通过以下几种方式实现: --- ## ✅ 方法一:使用 `dup2()` 重定向标准输出(stdout)和标准错误(stderr) 这是最常见的方式,适用于你想将整个程序的 `printf` 输出都重定向到文件中。 ### ✅ 示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <sys/types.h> int main() { // 打开日志文件,以追加方式写入 int fd = open("/var/log/myapp.log", O_WRONLY | O_CREAT | O_APPEND, 0644); if (fd == -1) { perror("open"); return 1; } // 重定向 stdout 和 stderr 到日志文件 if (dup2(fd, STDOUT_FILENO) == -1 || dup2(fd, STDERR_FILENO) == -1) { perror("dup2"); close(fd); return 1; } // 关闭原始的文件描述符 close(fd); // 测试输出 printf("This will be written to /var/log/myapp.log\n"); fprintf(stderr, "This error message will also be logged\n"); return 0; } ``` ### ✅ 效果: - 所有 `printf`、`puts`、`putchar`、`fprintf(stdout, ...)` 的输出都会被写入 `/var/log/myapp.log` - `fprintf(stderr, ...)` 也会被写入 --- ## ✅ 方法二:封装 `printf` 到自定义日志函数 如果你不想全局重定向,而是想控制哪些输出写入日志文件,可以自己封装一个函数。 ### ✅ 示例代码: ```c #include <stdio.h> #include <stdarg.h> #include <time.h> FILE *log_file = NULL; void log_init(const char *filename) { log_file = fopen(filename, "a"); if (!log_file) { perror("fopen"); exit(1); } } void log_printf(const char *format, ...) { va_list args; va_start(args, format); // 打印到控制台 vprintf(format, args); // 打印到日志文件 if (log_file) { vfprintf(log_file, format, args); fprintf(log_file, "\n"); fflush(log_file); } va_end(args); } void log_close() { if (log_file) { fclose(log_file); } } // 使用示例 int main() { log_init("/var/log/myapp.log"); log_printf("This is a log message: %d", 123); log_printf("Another log line"); log_close(); return 0; } ``` ### ✅ 优点: - 更加灵活,可以控制哪些内容写入日志 - 可以添加时间戳、日志级别等功能 --- ## ✅ 方法三:使用 shell 命令重定向(适用于启动脚本) 如果你不想修改程序,可以直接在命令行中重定向输出: ```bash ./myprogram > /var/log/myapp.log 2>&1 & ``` | 符号 | 含义 | |------|------| | `>` | 重定向 stdout | | `2>&1` | 将 stderr 重定向到 stdout | | `&` | 后台运行 | --- ## ✅ 方法四:使用 `syslog` 系统日志服务(推荐用于系统服务) 如果你是写一个守护进程或系统服务,推荐使用 `syslog` 接口: ### ✅ 示例代码: ```c #include <syslog.h> #include <stdio.h> int main() { // 打开 syslog,标识为 "myapp" openlog("myapp", LOG_PID | LOG_CONS, LOG_USER); // 写入日志 syslog(LOG_INFO, "This is an info message: %d", 123); syslog(LOG_ERR, "This is an error message"); // 关闭 syslog closelog(); return 0; } ``` ### ✅ 日志位置: - 默认写入 `/var/log/syslog` 或 `/var/log/messages`,取决于系统配置 --- ## ✅ 总结对比 | 方法 | 是否全局重定向 | 是否灵活 | 是否推荐 | |------|----------------|----------|----------| | dup2 重定向 | ✅ 是 | ❌ 否 | ✅ 适用于简单程序 | | 自定义 log 函数 | ❌ 否 | ✅ 是 | ✅ 推荐用于需要控制日志内容的程序 | | Shell 重定向 | ✅ 是 | ❌ 否 | ✅ 适用于脚本启动 | | syslog | ❌ 否 | ✅ 是 | ✅ 推荐用于系统服务 | --- ##
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值