AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-259023

Weijun Zhou's questions

Martin Hope
Weijun Zhou
Asked: 2023-04-01 16:53:49 +0800 CST

为什么在 bash 的条件表达式中某些字符串比较运算符周围不需要空格?

  • 18

今天在编写一些 bash 脚本时,我发现了一些令人惊讶的事情。我把它归结为这个最小的例子。

[[ a>b ]]; echo $?

根据我的理解,因为 两边没有空格>,所以这里应该是检测字符串是否a>b不为空,应该返回错误码0。但是,上面的命令1在我测试的两个 bash 版本中都有响应(详情如下)。

我还使用旧的“good”test命令进行了测试,

[ a>b ]; echo $?echos 0(测试字符串a不为空并b在我当前的工作目录中创建一个空文件,显然>b被视为重定向,这是可以理解的)。

然后我又尝试了一些其他的东西

  • [[ b>a ]]; echo $?echos0并且没有创建文件。
  • [[ b<a ]]; echo $?echos1并且没有创建文件。
  • [[ a<b ]]; echo $?echos0并且没有创建文件。
  • [ b>a ]; echo $?回声0并创建一个空文件a。
  • [ b<a ]; echo $?报告由于该错误而丢失文件a和回显的错误。1
  • [ a<b ]; echo $?报告由于该错误而丢失文件b和回显的错误。1
  • [[ a=b ]]; echo $?echos0因为它正在测试字符串是否a=b如我预期的那样非空。
  • [ a=b ]; echo $?0出于同样的原因回声。
  • [[ a==b ]]; echo $?0出于同样的原因回声。
  • [ a==b ]; echo $?0出于同样的原因回声。
  • [[ a!=a ]]; echo $?并且[ a!=a ]; echo $?都回显0(预期)

因此,在条件表达式中似乎只有<and周围的空格>可以省略,但 or =or ==if!=的目的是进行字符串比较。但是为什么要这样设计呢?这也可能是我的遗漏,但这似乎没有在 bash 手册的任何地方记录。

我最初的问题是尝试使用>未转义作为条件表达式 ( ) 中模式的一部分[[ ... ]]。我最初认为只要我不用>空格包围我就应该能够毫无问题地使用它,因为它没有意义(并且经过一些测试证明是不可能的)在条件内进行重定向表达要么。

然而事实并非如此。当然,简单的解决方案就是转义>并改为编写\>,但我不明白为什么需要它。

这是我用于测试的 bash 版本,

GNU bash, version 5.2.2(1)-release (aarch64-unknown-linux-android)

和

GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)

我的实验是在 下进行的env -i bash --norc --noprofile。

bash
  • 1 个回答
  • 713 Views
Martin Hope
Weijun Zhou
Asked: 2019-04-28 09:35:59 +0800 CST

`a[bc]d`(方括号)和 `a{b,c}d`(大括号)有什么区别?

  • 28

a[bc]d和 和有什么不一样a{b,c}d?为什么人们a{b,c}d在已经有的时候使用a[bc]d?

brace-expansion pattern-matching
  • 2 个回答
  • 3825 Views
Martin Hope
Weijun Zhou
Asked: 2019-04-22 03:18:14 +0800 CST

在交互式会话中从子外壳内部修改 bash 历史记录

  • 1

我执行了

history > before; (history -d $n); history > after

其中$n是对应于我在执行此行之前在同一交互式会话中键入的最后一个命令的数字,

结果是标记的行$n没有从历史记录中删除。如果我删除括号以便history -d在当前 shell 中运行,它会按记录工作。

如何理解这种行为?是否所有操纵历史的脚本都需要sourced?

bash history
  • 1 个回答
  • 497 Views
Martin Hope
Weijun Zhou
Asked: 2019-03-18 14:49:28 +0800 CST

在这种情况下,为什么 `sed` no op 比 `awk` 快得多

  • 4

我试图了解与sedand相关的一些性能问题awk,我做了以下实验,

$ seq 100000 > test
$ yes 'NR==100001{print}' | head -n 5000 > test.awk
$ yes '100001{p;b}' | head -n 5000 > test.sed
$ time sed -nf test.sed test
real    0m3.436s
user    0m3.428s
sys     0m0.004s
$ time awk -F@ -f test.awk test
real    0m11.615s
user    0m11.582s
sys     0m0.007s
$ sed --version
sed (GNU sed) 4.5
$ awk --version
GNU Awk 4.2.1, API: 2.0 (GNU MPFR 3.1.6-p2, GNU MP 6.1.2)

在这里,由于测试文件只包含 100000 行,所有的命令都是test.sed无test.awk操作的。两个程序只需要将行号与地址(in sed)或NR(in awk)进行匹配,就可以判断该命令不需要执行,但是时间成本上还是有很大区别的。为什么会这样?是否有人安装了不同版本sed并awk在此测试中给出了不同的结果?

编辑:结果mawk(如@mosvy 所建议),original-awk(在基于debian 的系统中“一个真正的awk”的名称,由@GregA.Woods 建议)并perl在下面给出,

$ time mawk -F@ -f test.awk test
real    0m5.934s
user    0m5.919s
sys     0m0.004s
$ time original-awk -F@ -f test.awk test
real    0m8.132s
user    0m8.128s
sys     0m0.004s
$ yes 'print if $.==100001;' | head -n 5000 > test.pl
$ time perl -n test.pl test
real    0m33.245s
user    0m33.110s
sys     0m0.019s
$ mawk -W version
mawk 1.3.4 20171017
$ perl --version
This is perl 5, version 28, subversion 1 (v5.28.1) built for x86_64-linux-thread-multi

在和的情况下替换-F@为-F ''不会产生可观察到的变化。不支持空。gawkmawkoriginal-awkFS

编辑 2 @mosvy 的测试给出了不同的结果,21ssed和 11s mawk,有关详细信息,请参阅下面的评论。

awk sed
  • 2 个回答
  • 1118 Views
Martin Hope
Weijun Zhou
Asked: 2018-06-08 22:51:50 +0800 CST

域名服务器多种可能配置之间的关系

  • 0

有很多(恕我直言,太多)地方可以配置所使用的 DNS 服务器,我不确定它们之间的关系。几个问题是:哪些配置只是有条件地查询(比如我理解正确,如果相应的服务没有运行,则不查询systemd配置)?哪些配置会覆盖哪些配置?配置 DNS 的推荐方法是什么?

举几个配置DNS服务器的地方(以及我知道的一些其他信息,如果有任何误解,请更正),

  1. 写入/etc/resolv.conf并使用chattr强制它在重新启动后保持持久性(我认为这是不鼓励的)
  2. resolvconf. 在/etc/resolvconf/resolv.conf.d. 用于resolvconf -a添加 DNS 并resolvconf -u对其进行更新
  3. systemd-resolve(d), 的一个单位systemd。配置在/etc/systemd/resolvd.conf. 它使用该地址127.0.0.53作为/etc/resolv.conf. 真实resolv.conf存在于/var/run/systemd/resolve/resolv.conf. 在较新的版本中(从哪个版本开始?),systemd-resolve --status可用于查询当前 DNS 状态。
  4. /etc/network/interfaces. 这一项与/etc/systemd/system/network-online.target.wants/networking.service
  5. Network-Manager,一个在 GUI 中驱动网络配置上下文菜单的组件。如果在 中配置了接口/etc/network/interfaces,它将拒绝再次对其进行管理(如not managedGUI 上下文菜单中所示)。

我正在Ubuntu 18.04 LTS使用 Unity 桌面环境运行。

networking ubuntu
  • 1 个回答
  • 369 Views
Martin Hope
Weijun Zhou
Asked: 2018-03-13 19:23:37 +0800 CST

中断 shell 命令行扩展

  • 5

警告:请勿在不了解其含义的情况下尝试此问题中列出的命令。

抱歉,如果这是重复的。我很惊讶地发现一个简单的命令

echo $(yes)

冻结了我的计算机(实际上它严重滞后于计算机而不是冻结,但滞后严重到让人认为它已冻结)。键入CtrlC或CtrlZ在键入此命令后立即键入似乎并不能帮助我从这个输入错误的命令中恢复。

另一方面

ls /*/../*/../*/../*/../*/

是一个众所周知的漏洞,它也会严重滞后于计算机的最佳状态,并使计算机崩溃到最坏的状态。

请注意,这些命令与众所周知的 fork 炸弹完全不同。

我的问题是:有没有办法在我开始在 shell 中执行这些命令后立即中断这些命令,这些命令会构建大量的 shell 命令行选项?

我的理解是,由于shell扩展是在命令执行之前完成的,因此中断命令的通常方法不起作用,因为发生滞后时命令甚至没有运行,但我也想确认我的理解是正确的,并且我非常有兴趣了解在它使用太多内存之前取消 shell 扩展的任何方法。

我不是在寻找内核如何在低内存下工作。当系统已经严重滞后时,我也不会寻找SysRq可能有用的过度杀伤力。我也不是在寻找诸如强加ulimit记忆之类的预防性方法。我正在寻找一种方法,可以在它滞后于系统之前从 shell 本身有效地取消一个巨大的 shell 扩展过程。我不知道这是否可能。如果按照评论不可能,也请留下一个答案,最好附上解释。

我选择不在原始问题中包含任何特定于系统的信息,因为我想要一个一般性的答案,但如果这很重要,这里是关于我的系统的信息:Ubuntu 16.04.4 LTS使用gnome-terminaland bash 4.3.48(1),运行x86_64系统。不涉及虚拟机。

bash command-line
  • 1 个回答
  • 1019 Views
Martin Hope
Weijun Zhou
Asked: 2018-02-04 16:49:55 +0800 CST

bash 中的双引号如何匹配(配对)?

  • 16

我正在使用GNU bash 4.3.48. 考虑以下两个仅相差一个美元符号的命令。

命令 1:

echo "(echo " * ")"

命令 2:

echo "$(echo " * ")"

它们的输出分别是

(echo  test.txt ppcg.sh )

和

 * 

所以很明显在第一种情况下*是全局的,这意味着第一个引号与第二个引号形成一对,第三个和第四个形成另一个对。

在第二种情况下,*不是全局的,并且输出中正好有两个额外的空格,一个在星号之前,一个在星号之后,这意味着第二个引号与第三个引号一起出现,而第一个引号与第四个引号一起出现。

$()除了引号不与下一个匹配而是嵌套的构造之外,还有其他情况吗?这种行为是否有据可查,如果有,我在哪里可以找到相应的文档?

bash quoting
  • 2 个回答
  • 4137 Views
Martin Hope
Weijun Zhou
Asked: 2018-01-22 11:39:16 +0800 CST

使用制表符完成与执行`ls`的不同行为

  • 1

我在ServerFault上注意到了这个问题:

FreeBSD:目录名为 ^C(真的!) - 如何删除?

^V我很久以前就知道这部分了。在那篇文章中让我感兴趣的是,OP 可以在 Tab 完成中将^C字符视为^C(插入符号后跟 a C),但在ls. 所以我稍微查了一下手册页,我可以找到ls -b哪些输出\003,ls -N哪些对 没有任何特殊作用^C,ls --show-control-chars哪些在屏幕上显示 Unicode 字符。

我的第一个问题是,是否有一种简单的方法ls可以生成与 Tab 完成相同类型的输出,即^C(插入符号后跟 a C)?(cat -v行为)。

我的第二个问题是,环境变量如何$LANG影响$LC_*Tab 完成生成的输出(我认为它记录complete在 Bash 手册的第 8 节中,但似乎没有发现任何相关内容)?

我使用的是bash4.3,但也欢迎其他 shell 的解决方案。

bash ls
  • 1 个回答
  • 624 Views
Martin Hope
Weijun Zhou
Asked: 2018-01-16 08:37:44 +0800 CST

对给定的行号执行 sed 操作

  • 10

我想知道是否有一种简单的方法可以使用预先分配的行号对某些行进行操作。

假设我想输出文件的第 1 行、第 7 行、第 14 行和第 16 行,我可以简单地做

sed -n '1p;7p;14p;16p' input_file

但是当操作不仅仅是打印时,这会变得更加复杂,而且我不想编写相同的长命令 4 次(是的,我知道我可以通过替换相同的 bash 变量 4 次来构造这个长 sed 命令,但是这还不够理想......),即

sed -n '1{long_command};7{long_command};14{long_command};16{long_command}' input_file

有没有办法对我文件的这些特定行进行操作?我期待类似的东西,

sed -n '1,7,14,16p'

这肯定不会以当前的形式工作。

任何帮助将不胜感激。“不,这不可能。” 有解释也是我会接受的答案。

sed
  • 3 个回答
  • 5987 Views
Martin Hope
Weijun Zhou
Asked: 2018-01-14 00:04:17 +0800 CST

如何在不借助包管理系统的情况下找出 `dash` 的版本号?

  • 7

我bash大部分时间都在使用,并且刚刚开始使用其他 shell。我开始dash并试图找出它的版本号,但通常的方法喜欢-v或$version不起作用。我可以理解这--version是行不通的,因为那是 GNU 特定的。我在网上搜了一下,找到了以下答案,都是求助于包管理系统。

如何判断dash的版本号?(用户使用的是 CentOS,所以答案取决于 Redhat Package Management 系统)

和

如何在 Ubuntu bin 上找到 dash shell 的版本?(这来自 AskUbuntu 网站,所以答案取决于高级软件包工具)

dash那么有没有办法在不借助包管理系统的情况下找出版本?如果没有简单的方法,我会很惊讶,因为我一直认为查询软件版本是最基本的功能之一。如果真的是这样,我很乐意听到一些解释,例如这种设计背后的理念是什么。我很乐意接受一种简单的方法来获取dash版本而无需求助于包管理系统,或者接受一个令人信服的解释(历史观点也可以),说明为什么我不能将其作为公认的答案。

dash
  • 2 个回答
  • 1725 Views
Martin Hope
Weijun Zhou
Asked: 2018-01-06 08:03:34 +0800 CST

使用参数从历史记录运行命令

  • 1

每当我需要输入长命令时,我发现引用历史的感叹号非常方便。例如,!ssh可用于调用ssh我使用的最后一个命令。但是,当将空格分隔的参数添加到搜索中时,我无法让它工作。

通过执行!ssh -i,我希望以字符串“ssh -i”开头的最后一个命令被执行。但是,调用的实际命令是ssh带有任何参数的最后一个命令,然后将“-i”附加到命令中。

我可以使用!?ssh -i?,但这意味着做一些不同的事情,我相信应该有一种简单的方法来实现这一点。我也不愿意history|grep ...每次都打字。

那么如何引用历史中以包含空格的字符串开头的命令,如上所述?

编辑似乎我没有足够清楚地解释这个问题。假设我有以下历史

ssh -i identity host1
echo ssh -i
ssh host2

现在如果我运行!ssh,第三个命令,ssh host2即将被执行。我希望键入!ssh -i以执行第一个命令,但ssh host2 -i改为执行(这会导致错误)。只有当第二个命令不存在时,我才能使用!?ssh -i?执行第一个命令。

bash command-history
  • 2 个回答
  • 508 Views
Martin Hope
Weijun Zhou
Asked: 2018-01-04 18:35:15 +0800 CST

何时提示用户确认,如果这样做,它何时默认为“是”

  • 2

TL / DR:我认为接受的答案是我期望的完整答案。仍然欢迎为该主题添加有用信息的其他答案。

我使用过rpm( dnf) 和apt包管理系统。在rpm系统中,我注意到当我更新或安装新软件包时,它几乎总是提示用户确认,并且大多数时候默认为“否”。在apt系统中,我注意到有时它不会提示用户确认,有时会提示用户默认“是”。

所以我的问题是,什么时候apt-get或类似的事情会提示用户确认,如果这样做,它什么时候默认为是?

我想如果我挖掘源代码应该能够找到答案,apt但我没有做到,可能是因为我没有使用正确的工具或正确的方法来处理源代码。

请注意,我不是要求或类似的东西apt-get -yapt-get --assume-no。我知道这些选项,我并不是要求有人告诉我它们存在。我问的是没有提供其他命令行标志时的行为。编译时可能取决于命令行选项,但回答apt默认debian和ubunturepos 中的行为就足够了。

编辑:我知道 LinuxQuestions.org 上有Apt-get install 不要求确认,但我一直认为在某些情况下提示apt-get默认为 no(即[y/N]),我希望从源头获得证据。

从接受的答案中,很明显

如果提示在表单中

Do you want to continue? [Y/n]

它始终默认为是。

从已接受答案中的评论中,我终于从我一直在寻找的源代码中找到了证据:https ://github.com/Debian/apt/search?utf8=%E2%9C%93&q=YnPrompt

所以我想我已经找到了我的问题的完整答案。

编辑 2:我在接受答案后不久意识到,我实际上看到了[y/N]基于yum系统的系统。

apt
  • 1 个回答
  • 574 Views
Martin Hope
Weijun Zhou
Asked: 2017-12-29 18:41:48 +0800 CST

什么情况下空格的数量在 bash(或其他 shell)脚本中很重要

  • 17

有人告诉我,空格在bash其他 shell 脚本中很重要,除非我知道自己在做什么,否则我不应该更改空格的存在。“改变存在”是指在两个非空格字符之间插入一个空格或删除两个非空格字符之间的空格,例如更改var="$val"为var ="$val"或反之亦然。我想问一下

是否存在在 shell 脚本中使用单个空格或使用多个连续空格会产生影响的情况?.

(当然,在引号中插入/删除空格会有所不同,例如从echo "a b"to更改echo "a b"或反之亦然。我正在寻找除了这个简单示例之外的示例。)

我遇到过这个问题,但那个问题是关于在两个非空格字符之间添加和删除空格,我知道很多例子会有所作为。

任何帮助,将不胜感激。如果可能,包括更多种类的贝壳。

shell-script shell
  • 5 个回答
  • 5911 Views
Martin Hope
Weijun Zhou
Asked: 2017-12-09 13:31:11 +0800 CST

管道作为并行命令

  • 3

通常,Unix 中的管道用于连接两个命令,并将第一个命令的输出用作第二个命令的输入。但是,我最近提出了使用管道并行运行多个命令的想法(这可能不是新的,但我没有找到太多谷歌搜索),如下所示:

command1 | command2

如果不从标准输入读取并且不写入标准输出,这将并行调用command1和。说明这一点的最小示例是(请在交互式 shell 中运行它)command2command2command1

ls . -R 1>&2|ls . -R

我的问题是,使用管道以这种方式并行执行两个命令有什么缺点吗?这个想法有什么我遗漏的吗?

非常感谢您提前。

bash parallelism
  • 2 个回答
  • 1092 Views
Martin Hope
Weijun Zhou
Asked: 2017-12-08 03:42:11 +0800 CST

手册页窗口中的可用命令在哪里记录,这些命令是否依赖于系统?

  • 9

使用Linux多年,突然发现自己不知道如何man正确使用命令。众所周知,可以键入q以退出手册页、/进行搜索等。但是,我不知道这些记录在哪里。我试过man man man -a man info man谷歌搜索,没有运气。

请指点我寻找此信息的正确位置,即使它在正确位置man man并且我碰巧忽略了它,也很好,请告诉我。

对于不同的操作系统或不同的 Linux 发行版,这些命令是否不同?

man
  • 4 个回答
  • 712 Views
Martin Hope
Weijun Zhou
Asked: 2017-12-07 18:24:38 +0800 CST

如何使用 grep 只获取匹配的部分,而不引入额外的换行符

  • 0

我有一个命令的输出,我想通过管道传递给某种 grep 命令,以获取每行中与给定正则表达式匹配的部分,并且只输出匹配的部分,而不引入换行符

我知道grep -o可以做一些非常相似的事情,但它会为每个匹配生成一个换行符,并且我的命令的输出也包含许多新行。

例子:

输入(我的命令的输出):

banana apple banana
apple bananas banned

正则表达式:

ban[a-z]*

输出grep -o:

banana
banana
bananas
banned

预期输出:

bananabanana
bananasbanned

我能想到的一件事是使用tr将换行符替换为一些不太可能出现在命令输出中的字符,将输出提供给grep -o,然后用于tr取回换行符。

mycommand|tr '\n' @|grep -o regex|tr -d '\n'|tr @ '\n'

但是我想应该有一些更好的解决方案。任何帮助,将不胜感激。

bash text-processing
  • 1 个回答
  • 1533 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve