问题列表 - 第5556页

如何在 Bash 中针对逻辑表达式中未处理的运行时错误进行防御性编码?

我刚刚遇到一个错误,脚本中缺少一个函数。我已经trap提出了这些异常以提前停止脚本,但我注意到这并没有发生。进一步研究这一点,我发现作为逻辑表达式一部分发生的错误被认为是该表达式的一部分,而不是错误本身。

例如,请参阅此片段:

function _raise_error() {
    >&2 echo "Error on line $1"
}

trap '_raise_error $LINENO' ERR

# STDERR: _missing_function: command not found
_missing_function && echo "This expression is never true"

echo "This is printed, because the missing function error is not trapped"
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法来更具防御性地编写此代码,以使脚本在逻辑表达式中缺少函数时提前结束?我不确定如何捕捉这一点。在这种情况下使用set -e并没有什么区别,因为我已经捕获了错误并终止了脚本。

我最好的猜测是我需要将线路换行false。这不太理想,但我想不出更好的方法。

_missing_function && { echo "This expression is never true"; } || false
Run Code Online (Sandbox Code Playgroud)

bash shell-script error-handling

3
推荐指数
1
解决办法
195
查看次数

子shell可以创建子进程吗?

因此,如果我输入如下命令,PID 4920子 shell 就会创建一个子进程 ( )。

linuxprobe@DESKTOP-TP0G72N:~$ (sleep 2;ps -f --forest;sleep 5)
UID          PID    PPID  C STIME TTY          TIME CMD
linuxpr+     513     512  0 Feb17 pts/0    00:00:00 -bash
linuxpr+    4920     513  0 01:35 pts/0    00:00:00  \_ -bash
linuxpr+    4922    4920  0 01:35 pts/0    00:00:00      \_ ps -f --forest
Run Code Online (Sandbox Code Playgroud)

如果我输入如下命令,似乎没有创建子进程

linuxprobe@DESKTOP-TP0G72N:~$ (ps -f --forest)
UID          PID    PPID  C STIME TTY          TIME CMD
linuxpr+     513     512  0 Feb17 pts/0    00:00:00 -bash
linuxpr+    5511     513  0 01:45 pts/0    00:00:00  \_ ps …
Run Code Online (Sandbox Code Playgroud)

linux subshell

4
推荐指数
1
解决办法
366
查看次数

如果我不登录桌面环境,桌面环境还会消耗RAM吗?

对于 Linux(Ubuntu、Debian 等),不同的桌面环境消耗不同数量的资源(RAM)。Gnome 和 KDE 往往比 XFCE / LXDE / LXQT 等其他操作系统消耗更多 RAM:

https://unihost.com/help/how-to-choose-linux-desktop-environment-ram-usage/

我想知道如果我不通过桌面环境的 GUI 登录,而仅使用 ssh 与操作系统交互,这些桌面环境的 RAM 使用情况是否仍然会产生影响?

例如,我有一个 Debian Gnome 和一个 Debian XFCE。打开两台机器后,我只使用SSH与它们交互。在这种情况下,它们使用相同数量的 RAM 吗?

ssh gnome debian desktop-environment ram

5
推荐指数
1
解决办法
3124
查看次数

如果不是 root(或使用 sudo),rfkill 如何工作?

我在这个答案的最后看到了这样的说法:

PS:我不知道为什么 rfkill 在以非特权用户身份运行时起作用。在我的 Mint 上,它没有 setuid 或 setgid 位。

我很好奇,查看了我的 Arch 系统。这是我的系统上的内容sudorfkill外观。文件大小和日期已被省略。看起来没有 setuid 位rfkill(为了比较,有一个sudo)。

$ /usr/bin/env ls -lah $(which sudo) $(which rfkill)
-rwxr-xr-x 1 root root [OMITTED] /sbin/rfkill
-rwsr-xr-x 1 root root [OMITTED] /sbin/sudo
Run Code Online (Sandbox Code Playgroud)

有趣的是,运行rfkill以禁用和启用无线访问的工作方式如此处所述即使我是rfkill从我的帐户运行(即,不是 asroot和 not withsudo或类似)

如何不rfkillrequire ,因为通常启用/禁用硬件的命令需要以特权root运行?root

root privileges rfkill

2
推荐指数
1
解决办法
992
查看次数

从巨大的 tarball 中解压文件,但仅在两个时间戳之间创建

我只想解压在 2024-02-19 01:00:00 和 2024-02-19 02:00:00 之间从一个巨大的 tarball 创建的文件。

我不知道应该如何组合 tar 和 find 命令,因为我无法在 tar 中运行 find。

谢谢你的帮助,安德鲁

linux tar find

4
推荐指数
1
解决办法
485
查看次数

在 Linux 上,Firefox 正在侦听 0.0.0.0 上的多个 UDP 端口

在 Linux 上,Firefox 正在侦听 UDP 端口,通常在端口 30000 或更高端口上。这是什么原因?为什么不只是 localhost,而是 0.0.0.0,即也暴露于网络的接口?

linux networking firefox

7
推荐指数
1
解决办法
2815
查看次数

是否可以用 less 动态刷新journalctl?

我习惯于less查看我的journalctl日志,因为它更方便。当您退出 less 后,它不会使控制台窗口中的日志变得混乱,并且您可以使用鼠标滚轮滚动。

journalctl --unit xyz | less +G
Run Code Online (Sandbox Code Playgroud)

但很烦人的是我无法刷新日志。有没有办法做到这一点less?使用Shift+F不起作用。

less journalctl systemd-journald

6
推荐指数
2
解决办法
689
查看次数

EXT4 如何处理底层存储空间突然不足的情况?

通常,块设备驱动程序会报告设备的正确大小,并且可以实际使用所有“可用”块。因此,文件系统事先知道它可以向此类设备写入多少内容。
但在某些特殊情况下,例如使用dm-thindm-vdo设备时,这种说法是错误的。如果这种块设备的ENOSPC底层存储(上层 FS 对此一无所知)已满,那么它们随时可能返回错误。

因此,我的问题是,在这种情况下会发生什么:EXT4 文件系统已挂载r/w,处于async模式(默认),并且正在执行大量写入。磁盘缓存(脏内存)也会参与其中,此时如果用户运行sync命令,就会有大量数据需要写入。

但突然间,该 EXT4 文件系统的底层块设备开始拒绝任何写入,因为“没有剩余空间”。文件系统的行为是什么?
它会打印错误并进入r/o中止所有写入并可能导致数据丢失的模式吗?如果没有,它是否会等待空间,定期重试写入并拒绝新写入?在这种情况下,如果其他进程尝试分配大量 RAM,巨大的磁盘缓存会发生什么情况?(在 Linux 上,脏内存被认为是可用的,不是吗?)。
考虑到最坏的情况,如果磁盘缓存在错误发生时占用了大部分 RAM ENOSPC(因为管理员设置得vm.dirty_ratio太高),内核会崩溃或锁定吗?或者它只会使所有想要分配内存的进程等待/挂起?最后,不同文件系统的行为是否有所不同?
提前致谢。

linux filesystems ext4 block-device device-mapper

6
推荐指数
2
解决办法
1574
查看次数

如何读取巨大日志文件的最后几行?

我有一个 55GB 大小的日志。

我试过:

cat logfile.log | tail

但这种方法需要花费很多时间。有没有办法更快地读取大文件或任何其他方法?

bash

15
推荐指数
2
解决办法
3856
查看次数

awk 命令从标题包含特定子字符串的 csv 文件中提取列

我有一个巨大的 csv 文件,其格式为

aaa1, "aaa2, aa214", aa21, "aa, a14", aa211, aa44, aaa445 
data, data, data, data, data, data, data,
........................................
........................................
Run Code Online (Sandbox Code Playgroud)

我想提取标题包含特定字符串的列,比如说a2. 对于上面的示例,这包括列aaa2等等aa21

我尝试过的 awk 命令是

awk --csv 'NR==1 {for (i=1; i<=NF; i++) if ($i ~ /a2/) print $i}' file.csv 
Run Code Online (Sandbox Code Playgroud)

但这只返回匹配的标题,而不返回它们下面的列。请指出我正确的方向。我使用的是Linux系统。

awk text-processing csv

-1
推荐指数
1
解决办法
120
查看次数