小编Nor*_*tfi的帖子

Shell 中的 eval 有哪些有用的用例?

您经常听到它eval is evil,无论是在 Shell/POSIX 世界中,还是在其他语言(如 python 等)中...

但我想知道,它真的没用吗?或者是否有一些神秘的、未记录的、有趣的或只是有用的用例?

如果答案以sh/bash为中心,我会更喜欢,但如果它也与其他壳有关,那也没关系。

PS:我 知道 为什么EVAL被认为evil

shell eval

15
推荐指数
4
解决办法
1718
查看次数

了解pid_max、ulimit -u 和thread_max 之间的区别

我正在尝试了解 Linux 进程。我对各自的术语感到困惑pid_max,ulimit -uthread_max

这些术语之间究竟有什么区别?有人可以澄清这些差异吗?

process thread linux-kernel ulimit

12
推荐指数
2
解决办法
4万
查看次数

将 --force-confold 和 --force-confnew 与 dpkg 一起使用之间是否可能存在冲突?

本质上,我使用这个答案来获得应用程序的非交互式体验,例如dpkgapt以及其他可能依赖于前者的应用程序。

但问题是,这两个标志一起使用时是否有冲突?

我这么问是因为,据我了解:

apt-get -o Dpkg::Options::="--force-confdef"
Run Code Online (Sandbox Code Playgroud)

使用默认设置(取决于软件包,我相信有些会替换旧配置,有些会保留旧配置,除非我弄错了)

apt-get -o Dpkg::Options::="--force-confnew"
Run Code Online (Sandbox Code Playgroud)

保留新配置...

所以我有点困惑为什么某些来源提到其中两个标志,即使它们可能会或可能不会相互冲突(尝试过它们但不知道任何会启动的包,debconf除非我运行dist-upgrade并等待正确的包来做到这一点)。

我只需要其中一个还是两者都需要?

dpkg apt

8
推荐指数
1
解决办法
5688
查看次数

在后台使用命令启动 tmux,当 tmux 停止运行时不停止该命令

所以,我想通过 tmux 启动一个 shell 命令,但在后台并与所述 tmux 会话分离......所以我这样做:

tmux new-session -A -s myprogramsession \; send -t myprogramsession "nohup /usr/bin/myscript.sh &>/dev/null &" ENTER \; detach -s myprogramsession
Run Code Online (Sandbox Code Playgroud)

这有效。但现在,如果我想让 tmux 在与上述会话分离后停止,我需要执行以下操作:

这:

tmux new-session -A -s myprogramsession \; send -t myprogramsession "nohup /usr/bin/myscript.sh &>/dev/null &" ENTER \; detach -s myprogramsession \; kill-session -t myprogramsession
Run Code Online (Sandbox Code Playgroud)

或这个:

tmux new-session -A -s myprogramsession \; send -t myprogramsession "nohup /usr/bin/myscript.sh &>/dev/null &" ENTER \; detach -s myprogramsession && pkill tmux
Run Code Online (Sandbox Code Playgroud)

虽然这两种方法(一种 usingpkillkill-sessionfrom tmux …

shell bash tmux

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

替换整行,同时删除该特定行的换行符

我正在尝试替换(用sed)包含特定单词的整行末尾的换行符。这里的测试文件:

this # target for substitution
this is a test
another test?
Run Code Online (Sandbox Code Playgroud)

现在,我已经这里发布了,并且从链接的帖子中,我了解了如何以某种方式执行此操作:

sed 's/^this$/test/g' testfile
Run Code Online (Sandbox Code Playgroud)

这是有效的,或者至少看起来如此,因为单词末尾的换行符this仍然存在:

test # target for substitution but newline is still there
this is a test
another test?
Run Code Online (Sandbox Code Playgroud)

鉴于上述情况,我也完全意识到 sed不能直接匹配换行符(尽管我记得我可以在某些版本的 中使用 '\n' sed,但这无关紧要)。

我知道如何至少删除整个单词/行和换行符:

this # target for substitution
this is a test
another test?
Run Code Online (Sandbox Code Playgroud)

除了我需要替换它。

我怎样才能做到这一点?(sed最好有)

sed regular-expression

4
推荐指数
3
解决办法
339
查看次数

重置光标状态而不重新打开终端

当使用具有异常 tui 的应用程序或打印不支持的字符/终端序列时,通常会发生光标/终端无法正确显示的情况。

在那一刻,我通常会这样做,clear && reset在工作时,它无法将光标重置为通常状态,除非我关闭并重新打开终端(发生在我尝试过的大多数终端,xterm,st,urxvt等)

我尝试了帖子上推荐的大部分技巧,例如这个,以及其他类似的技巧,它们无法将光标重置为其初始状态(例如:保持不可见)

有什么推荐的方法可以重置光标的状态,而无需关闭/重新打开终端吗?

terminal

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

声明变量时防止命令替换运行

所以我最近注意到,在使用命令替换声明变量时,让我们这样说:

var=$(echo "this is running" > test; cat test)
Run Code Online (Sandbox Code Playgroud)

然后,它运行(该文件test将被创建),尽管我还不被称为(技术上的),我想这样:

var=$(echo "this is running" > test; cat test)
echo "$var" # is where i would "normally" call the variable
Run Code Online (Sandbox Code Playgroud)

在变量中声明命令替换时,如何防止命令替换实际运行,因此它仅在我调用所述变量时才实际运行

PS:很清楚这是一个不好的例子,但它很好地展示了我的意思,尽管“无用的使用 cat”和“无用的使用 echo”......

bash command-substitution variable

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

SECONDS 变量实际上有什么作用?

所以,正如标题所暗示的,我注意到这个奇怪的事情,sleep本质上是increment你把它作为参数给出的时间。例子:

#!/usr/bin/env bash
set -x
SECONDS="1"
while true; do
    echo "hello" || true
    sleep "$SECONDS"
done
Run Code Online (Sandbox Code Playgroud)

但不可否认,这只是因为我使用了该$SECONDS变量,而不是以不同的方式命名它......从我所看到的,它所做的只是输出时钟的秒数?有点像我猜的日期。

但除此之外它实际上还有什么作用呢?我认为我没有在 Bash 文档中看到过任何有关它的内容,也没有在任何公共脚本中看到过它。

bash time

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

具有双引号和由单引号包围的变量替换的 Grep 模式

所以,假设我有以下模式:

Thisisatest="1"
Run Code Online (Sandbox Code Playgroud)

在一个名为file.

我想匹配上面的确切字符串,无论出于何种原因,我选择循环列表中的一些数字,将它们用作变量并尝试执行以下操作:

Thisisatest="$varhere"
Run Code Online (Sandbox Code Playgroud)

上面$varhere等于上面的数字,是1。(虽然我提到了循环数字,但这只是一个未来可能的用例,仍然是一个例子)

现在为了让事情变得更简单,假设我想使用上述变量及其内容匹配上述精确模式:

grep 'Thisisatest="$varhere"' file
Run Code Online (Sandbox Code Playgroud)

其中文件包含字符串Thisisatest="1"$varhere包含数字1

问题是,这行不通,因为在单引号之间(如上)不会发生变量扩展。

这是反击失败的尝试:

  1. 从变量替换替换内容
echo "${varhere/[0-9]*/Thisisatest=\"$varhere\"}"
Run Code Online (Sandbox Code Playgroud)

在这里我echo用来查看它是否输出正确的字符串,以便它可以用作 grep 的输入......它输出这个:

'Thisisatest="'1'"
Run Code Online (Sandbox Code Playgroud)
  1. 添加更多报价
echo "'Thisisatest="${varhere}"'"
Run Code Online (Sandbox Code Playgroud)

输出:

'Thisisatest='1''
Run Code Online (Sandbox Code Playgroud)
echo ''''Thisisatest=\"${varhere}\"''''
Run Code Online (Sandbox Code Playgroud)

输出:

Thisisatest="'1'"
Run Code Online (Sandbox Code Playgroud)

其余的很明显......现在上面的最后一次尝试似乎接近我想要的,但仍然不是。

有什么办法可以做到以上几点?

grep quoting variable-substitution pattern-matching

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

如何使用相同数量的重复字符获取两个字符串之间的内容?

本质上,我试图获取两个字符串之间的内容,但是使用重复 N 次的相同字符,如下所示:

===
This is a test
===

====
Another test
====

==
Last test
==
Run Code Online (Sandbox Code Playgroud)

以上当然只是一个例子。这是我尝试过的和他们的结果:

===
This is a test
===

====
Another test
====

==
Last test
==
Run Code Online (Sandbox Code Playgroud)

=
This is a test

=




Another test






Last test


Run Code Online (Sandbox Code Playgroud)

如果我只在以下内容中使用上述之一testfile


Last test


Run Code Online (Sandbox Code Playgroud)

这将给出想要的结果(尽管添加了太多换行符,但对于本示例来说很好)。

仅当存在这些重复字符的单个实例或者它是包含内容的一对唯一字符串时,上述内容才有效...

如何使用相同数量的重复字符获取两个字符串之间的内容?我更喜欢使用grep,sedawk为此。

sed regular-expression

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