有没有办法找到所有没有指向的符号链接?
find ./ -type l
Run Code Online (Sandbox Code Playgroud)
会给我所有的符号链接,但不区分去某处的链接和不去某处的链接。
我目前正在做:
find ./ -type l -exec file {} \; | grep broken
Run Code Online (Sandbox Code Playgroud)
但我想知道存在哪些替代解决方案。
$ 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"]
。我在这里缺少什么?
这是来自bash
Mac 上的 shell。也可以在 CentOS 7 上看到它,而不是在 Fedora 上。有人可以解释一下吗?
我正在尝试创建一个可以运行任意命令的函数,与子进程交互(省略细节),然后等待它退出。如果成功,打字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() …
我正在寻找可以在 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,但这并不是我所需要的。我需要一个仅在我要搜索的文件中搜索的命令。
我需要从另一个命令的输出中提取一个 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 语句合并为一个?
我想将补丁文件应用于我当前的 Ubuntu 安装(补丁文件示例)。将补丁文件正确应用到我的 Linux 内核的过程是什么?
我是否需要完成将补丁应用到磁盘映像文件、将其刷入 USB 并安装新的 Linux 副本的整个过程?我可以只修补当前安装吗?或者我可以修补磁盘映像然后使用它来升级我当前的安装吗?
我试过的:
找出我正在运行的内核版本:
$ uname -srm
Linux 5.11.0-25-generic x86_64
Run Code Online (Sandbox Code Playgroud)
转到我的内核目录(我认为):
cd /lib/modules/5.11.0-25-generic/kernel
Run Code Online (Sandbox Code Playgroud)
应用补丁文件
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)
这样做的正确方法是什么?
注意:这个问题不同于如何修补任何随机文件。我知道该怎么做。问题具体是关于如何修补当前安装的内核。
bash ×2
grep ×2
shell ×2
coprocesses ×1
find ×1
job-control ×1
linux-kernel ×1
patch ×1
symlink ×1
tar ×1
tty ×1
upgrade ×1