小编Joh*_*man的帖子

如何找到损坏的符号链接

有没有办法找到所有没有指向的符号链接?

find ./ -type l
Run Code Online (Sandbox Code Playgroud)

会给我所有的符号链接,但不区分去某处的链接和不去某处的链接。

我目前正在做:

find ./ -type l -exec file {} \; | grep broken
Run Code Online (Sandbox Code Playgroud)

但我想知道存在哪些替代解决方案。

shell find symlink

352
推荐指数
6
解决办法
21万
查看次数

在 bash 中用方括号回显字符串返回“b”

$ a='"apple","ball","cat"'
$ a='['$a
$ echo $a
["apple","ball","cat"
$ a=$a']'
$ echo $a
b
Run Code Online (Sandbox Code Playgroud)

b当我期待看到时,我被结果难住了["apple,"ball","cat"]。我在这里缺少什么?

这是来自bashMac 上的 shell。也可以在 CentOS 7 上看到它,而不是在 Fedora 上。有人可以解释一下吗?

bash

10
推荐指数
1
解决办法
1483
查看次数

使用前台终端访问在后台运行命令

我正在尝试创建一个可以运行任意命令的函数,与子进程交互(省略细节),然后等待它退出。如果成功,打字run <command>看起来就像一个裸的<command>.

如果我不与子进程交互,我会简单地写:

run() {
    "$@"
}
Run Code Online (Sandbox Code Playgroud)

但是因为我需要在它运行时与之交互,所以我使用coproc和 进行了更复杂的设置wait

run() {
    exec {in}<&0 {out}>&1 {err}>&2
    { coproc "$@" 0<&$in 1>&$out 2>&$err; } 2>/dev/null
    exec {in}<&- {out}>&- {err}>&-

    # while child running:
    #     status/signal/exchange data with child process

    wait
}
Run Code Online (Sandbox Code Playgroud)

(这是一个简化。虽然coproc重定向和所有重定向在这里并没有真正做任何不能做的有用的"$@" &事情,但我在我的实际程序中需要它们。)

"$@"命令可以是任何东西。我拥有的功能可以使用run ls等等run make,但是当我这样做时它失败了run vim。我认为它失败了,因为 Vim 检测到它是一个后台进程并且没有终端访问权限,所以它不会弹出一个编辑窗口,而是自己挂起。我想修复它,以便 Vim 正常运行。

如何coproc "$@"在“前台”中运行而父 shell 成为“后台”?“与孩子交互”部分既不读取也不写入终端,所以我不需要它在前台运行。我很高兴将 tty 的控制权交给协进程。

对于我正在做的事情来说,重要的run() …

shell job-control tty background-process coprocesses

7
推荐指数
2
解决办法
3444
查看次数

如何在不解压的情况下在 tar.gz 中的特定文件中进行 grep?

我正在寻找可以在 tar.gz 存档中包含的特定文件中执行 grep 操作的命令。

例子:

文件:archive.tar.gz,其中 ? 包含:

fileA.txt
fileB.txt
fileC.txt
Run Code Online (Sandbox Code Playgroud)

我只想在 fileA.txt 中 grep 而不是在其他两个中,而不从原始存档中提取文件,只有一个命令。

是否可以?

我试过了:

for f in /path/*.gz; do
    tar -xzf "$f" --to-command='grep -Hn --label="$TAR_ARCHIVE/$TAR_FILENAME" pattern || true'
done
Run Code Online (Sandbox Code Playgroud)

此命令在存档中包含的所有文件中执行 grep,但这并不是我所需要的。我需要一个仅在我要搜索的文件中搜索的命令。

grep bash tar

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

将两个 grep 合并为一个

我需要从另一个命令的输出中提取一个 ID。目前我的提取命令如下所示:

someID=$(command | grep -oP '(?:^Successfully\sbuilt\s)([\da-z]{12}$)' | grep -oP '([a-z\d]{12})')
Run Code Online (Sandbox Code Playgroud)

示例命令输出:

 ---> Using cache
 ---> 9b4624927fa6
Successfully built 9b4624927fa6
Run Code Online (Sandbox Code Playgroud)

预期结果:

9b4624927fa6
Run Code Online (Sandbox Code Playgroud)

从行中提取的 ID

Successfully built 9b4624927fa6
Run Code Online (Sandbox Code Playgroud)

我怎样才能将这两个 grep 语句合并为一个?

grep regular-expression

3
推荐指数
2
解决办法
756
查看次数

如何将补丁文件应用到当前 Linux 安装的内核?

我想将补丁文件应用于我当前的 Ubuntu 安装(补丁文件示例)。将补丁文件正确应用到我的 Linux 内核的过程是什么?

我是否需要完成将补丁应用到磁盘映像文件、将其刷入 USB 并安装新的 Linux 副本的整个过程?我可以只修补当前安装吗?或者我可以修补磁盘映像然后使用它来升级我当前的安装吗?

我试过的:

  1. 找出我正在运行的内核版本:

    $ uname -srm
    Linux 5.11.0-25-generic x86_64
    
    Run Code Online (Sandbox Code Playgroud)
  2. 转到我的内核目录(我认为):

    cd /lib/modules/5.11.0-25-generic/kernel
    
    Run Code Online (Sandbox Code Playgroud)
  3. 应用补丁文件

    patch -p1 < ~/my-patch-file.patch
    
    Run Code Online (Sandbox Code Playgroud)

但是没有应用补丁。输出是:

can't find file to patch at input line 23
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
...
File to patch:
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

注意:这个问题不同于如何修补任何随机文件。我知道该怎么做。问题具体是关于如何修补当前安装的内核

patch upgrade system-installation linux-kernel

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