【问题标题】:In Linux, how to redirect wall output in script to file?在 Linux 中,如何将脚本中的墙输出重定向到文件?
【发布时间】:2026-01-19 15:00:01
【问题描述】:

我正在尝试使用以下行在 bash 脚本中记录事件:

#!/bin/bash
{
...
echo "Photo backup successfully finished on $(date)" | wall
...
} &>> "/var/log/$(basename "$0").log" &

但是,在日志文件中,相应的行改为:

wall: cannot get tty name: Inappropriate ioctl for device

似乎墙输出无法定向到文件。

我怎样才能让它工作? (能够发布到墙上并将消息记录到文件)

【问题讨论】:

    标签: linux bash logging


    【解决方案1】:

    一种可能性是使用“tee -a”而不是“>>”。例如:

    echo "Hello world"|tee -a myfile.log|wall

    【讨论】:

    • 谢谢,这行得通,但现在我的脚本中到处都是“|tee -a $LOGFILE”(对于我想要记录其输出的每个命令一次)。如果可能的话,如果我能避免这样的重复代码,那就太好了。
    • 创建一个函数,然后将日志名作为参数传入 :)
    • @MatthewPigram 我不确定这是否符合我最初的目的。我还需要有选择地将其中一些命令输出定向到墙上。
    • @silvernightstar 使用 2 个可传递参数、文件名和布尔值 (0 | 1) 创建函数,指示它是否应该使用 wall,使用 if 语句来处理正确的调用
    • 问:是什么阻止了您访问|tee -a /var/log/$(basename "$0").log
    【解决方案2】:

    似乎只是因为当前终端由其他用户/组拥有,而不是您从中运行命令。以下示例在 Fedora 21 中测试。

    检查与“w”类似使用的 TTY

    $ w
     09:20:21 up 10:34,  2 users,  load average: 0.22, 0.27, 0.35
    USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
    alex     pts/0     08:38   41:17   0.27s 13.46s /usr/bin/xfce4-terminal
    alex     pts/1     08:39    5.00s  0.81s 13.46s /usr/bin/xfce4-terminal
    

    然后

    $ ls -l /dev/pts/*
    total 0
    crw--w----. 1 alex tty  136, 0 Mar 13 09:18 0
    crw--w----. 1 alex tty  136, 1 Mar 13 09:22 1
    

    然后您可以将应该发送消息的用户添加到“tty”组中

    mcedit /etc/group
    ...
    tty:alex,nut
    ...
    

    【讨论】:

      最近更新 更多