您经常听到它eval is evil,无论是在 Shell/POSIX 世界中,还是在其他语言(如 python 等)中...
但我想知道,它真的没用吗?或者是否有一些神秘的、未记录的、有趣的或只是有用的用例?
如果答案以sh/bash为中心,我会更喜欢,但如果它也与其他壳有关,那也没关系。
我正在尝试了解 Linux 进程。我对各自的术语感到困惑pid_max,ulimit -u和thread_max。
这些术语之间究竟有什么区别?有人可以澄清这些差异吗?
本质上,我使用这个答案来获得应用程序的非交互式体验,例如dpkg,apt以及其他可能依赖于前者的应用程序。
但问题是,这两个标志一起使用时是否有冲突?
我这么问是因为,据我了解:
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并等待正确的包来做到这一点)。
我只需要其中一个还是两者都需要?
所以,我想通过 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)
虽然这两种方法(一种 usingpkill和kill-sessionfrom tmux …
我正在尝试替换(用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最好有)
当使用具有异常 tui 的应用程序或打印不支持的字符/终端序列时,通常会发生光标/终端无法正确显示的情况。
在那一刻,我通常会这样做,但clear && reset在工作时,它无法将光标重置为通常状态,除非我关闭并重新打开终端(发生在我尝试过的大多数终端,xterm,st,urxvt等)
我尝试了帖子上推荐的大部分技巧,例如这个,以及其他类似的技巧,它们无法将光标重置为其初始状态(例如:保持不可见)
有什么推荐的方法可以重置光标的状态,而无需关闭/重新打开终端吗?
所以我最近注意到,在使用命令替换声明变量时,让我们这样说:
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”......
所以,正如标题所暗示的,我注意到这个奇怪的事情,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 文档中看到过任何有关它的内容,也没有在任何公共脚本中看到过它。
所以,假设我有以下模式:
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。
问题是,这行不通,因为在单引号之间(如上)不会发生变量扩展。
这是反击失败的尝试:
echo "${varhere/[0-9]*/Thisisatest=\"$varhere\"}"
Run Code Online (Sandbox Code Playgroud)
在这里我echo用来查看它是否输出正确的字符串,以便它可以用作 grep 的输入......它输出这个:
'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)
echo ''''Thisisatest=\"${varhere}\"''''
Run Code Online (Sandbox Code Playgroud)
输出:
Thisisatest="'1'"
Run Code Online (Sandbox Code Playgroud)
其余的很明显......现在上面的最后一次尝试似乎接近我想要的,但仍然不是。
有什么办法可以做到以上几点?
本质上,我试图获取两个字符串之间的内容,但是使用重复 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,sed或awk为此。