a[bc]d和 和有a{b,c}d什么区别?为什么人们a{b,c}d在已经有的时候使用a[bc]d?
Bash 使用感叹号进行历史扩展,如该问题的答案中所述(例如,使用sudo !!运行先前的命令行sudo)。但是,我找不到任何解释运行以下命令(即单个感叹号)的作用的地方:
!
Run Code Online (Sandbox Code Playgroud)
它似乎不打印任何内容并以 1 退出,但我不确定为什么会这样。我已经在网上和 Bash 手册页中查看过,但除了它是一个“保留字”这一事实之外,找不到任何东西——但也是如此},并运行这个:
}
Run Code Online (Sandbox Code Playgroud)
打印错误:
bash: syntax error near unexpected token `}'
Run Code Online (Sandbox Code Playgroud) 有人告诉我,空格在bash或其他 shell 脚本中很重要,除非我知道自己在做什么,否则我不应该改变空格的存在。“改变存在”是指在两个非空格字符之间插入一个空格或删除两个非空格字符之间的空格,例如更改var="$val"为var ="$val"或反之亦然。我想问一下
是否存在在 shell 脚本中使用单个空格或使用多个连续空格会产生影响的情况?.
(当然,在引号中插入/删除空格会有所不同,例如从echo "a b"to更改为,echo "a b"反之亦然。我正在寻找除这个简单示例之外的示例。)
我遇到过这个问题,但那个问题是关于在两个非空格字符之间添加和删除空格的,我知道很多例子表明它会有所作为。
任何帮助,将不胜感激。如果可能,包括更多种类的贝壳。
我正在使用GNU bash 4.3.48. 考虑以下两个仅相差一个美元符号的命令。
命令 1:
echo "(echo " * ")"
Run Code Online (Sandbox Code Playgroud)
命令 2:
echo "(echo " * ")"
Run Code Online (Sandbox Code Playgroud)
它们的输出分别为
(echo test.txt ppcg.sh )
Run Code Online (Sandbox Code Playgroud)
和
*
Run Code Online (Sandbox Code Playgroud)
所以很明显,在第一种情况下,the *is globbed,这意味着第一个引号与第二个组成一对,第三个和第四个组成另一对。
在第二种情况下,the *is not globbed,并且输出中正好有两个额外的空格,一个在星号之前,一个在星号之后,这意味着第二个引号与第三个一起,第一个与第四个一起。
除了$()引号与下一个不匹配,而是嵌套的构造之外,还有其他情况吗?这种行为是否有详细记录,如果有,我在哪里可以找到相应的文档?
今天我在编写一些 bash 脚本时发现了一些令人惊讶的事情。我已将其归结为这个最小的示例。
[[ a>b ]]; echo $?
根据我的理解,因为 周围没有空格>,所以这应该测试字符串是否a>b不为空,并且应该返回错误代码0。然而,上面的命令1在我测试的两个 bash 版本中都有回显(详细信息如下)。
我还使用旧的“good”test命令进行了测试,
[ a>b ]; echo $?echo 0(测试字符串a不为空并b在我当前的工作目录中创建一个空文件,显然>b被视为重定向,这是可以理解的)。
然后我又尝试了一些其他的事情
[[ b>a ]]; echo $?回声0并且没有创建文件。[[ b<a ]]; echo $?回声1并且没有创建文件。[[ a<b ]]; echo $?回声0并且没有创建文件。[ b>a ]; echo $?echo0并创建一个空文件a。[ b<a ]; echo $?报告丢失文件的错误a并 …我想知道是否有一种简单的方法可以使用预先分配的行号对某些行进行操作。
假设我想输出文件的第 1、7、14 和 16 行,我可以简单地做
sed -n '1p;7p;14p;16p' input_file
Run Code Online (Sandbox Code Playgroud)
但是当操作不仅仅是打印时这会变得更加复杂,而且我不想写相同的长命令 4 次(是的,我知道我可以通过替换相同的 bash 变量 4 次来构造这个长 sed 命令,但是这还不够理想......),即
sed -n '1{long_command};7{long_command};14{long_command};16{long_command}' input_file
Run Code Online (Sandbox Code Playgroud)
有没有办法对我的文件的这些特定行进行操作?我期待这样的事情,
sed -n '1,7,14,16p'
Run Code Online (Sandbox Code Playgroud)
这肯定不会以当前的形式工作。
任何帮助将不胜感激。“不,这不可能。” 有解释也是我会接受的答案。
使用Linux多年,突然发现不知道如何man正确使用命令。众所周知,可以通过键入q来退出手册页、/进行搜索和其他操作。但是,我不知道这些记录在哪里。我尝试过man man man -a man info man谷歌搜索,但没有运气。
请指向我寻找此信息的正确位置,即使它就在其中man man并且我碰巧忽略了它,也很好,请告诉我。
对于不同的操作系统或不同的 Linux 发行版,这些命令是否不同?
警告:不要在不知道其含义的情况下尝试此问题中列出的命令。
对不起,如果这是重复的。我很惊讶地发现一个简单的命令
echo $(yes)
Run Code Online (Sandbox Code Playgroud)
冻结了我的计算机(实际上它严重滞后于计算机而不是冻结,但滞后严重到让人认为它已冻结)。键入CtrlC或CtrlZ在键入此命令后立即键入似乎并不能帮助我从这个错误键入的命令中恢复过来。
另一方面
ls /*/../*/../*/../*/../*/
Run Code Online (Sandbox Code Playgroud)
是一个众所周知的漏洞,它也使计算机严重滞后于最佳状态并使计算机崩溃至最坏状态。
请注意,这些命令与众所周知的分叉炸弹有很大不同。
我的问题是:有没有办法在我开始在 shell 中执行这些命令后立即中断这些命令,这些命令会立即建立大量的 shell 命令行选项?
我的理解是,由于 shell 扩展是在命令执行之前完成的,通常的中断命令的方法不起作用,因为在发生滞后时命令甚至没有运行,但我也想确认我的理解是正确的,并且我非常有兴趣学习在使用过多内存之前取消 shell 扩展的任何方法。
我不是在寻找内核如何在低内存下工作。我也不是在寻找SysRq在系统已经严重滞后时可能会有帮助的过度杀伤力。我也不是在寻找预防方法,例如ulimit在记忆中强加一个。我正在寻找一种方法,可以在它滞后于系统之前有效地从外壳本身内部取消巨大的外壳扩展过程。我不知道是否有可能。如果评论不可能,请同时留下一个答案,指出这一点,最好附上解释。
我选择不在原始问题中包含任何特定于系统的信息,因为我想要一个一般性的答案,但如果这很重要,这里是有关我的系统的信息:Ubuntu 16.04.4 LTS使用gnome-terminal和bash 4.3.48(1),运行x86_64系统。不涉及虚拟机。
我bash大部分时间都在使用,刚刚开始玩其他 shell。我开始dash尝试找出它的版本号,但通常的方法如-v或$version不起作用。我可以理解这--version不会起作用,因为这是 GNU 特定的。我在网上搜索,找到了以下答案,都是求助于包管理系统。
如何判断dash的版本号?(用户使用的是 CentOS,所以答案取决于 Redhat 包管理系统)
和
如何在 Ubuntu bin 上找到 dash shell 的版本?(这是来自 AskUbuntu 站点,所以答案取决于 Advanced Package Tool)
那么有dash没有不借助包管理系统就可以查到版本的方法呢?如果没有简单的方法我会很惊讶,因为我一直认为查询软件版本是最基本的功能之一。如果真是这样,我很乐意听到一些解释,例如这种设计背后的哲学是什么。我很乐意接受一种dash无需借助包管理系统即可获取版本的简单方法,或者接受令人信服的解释(从历史角度来看也可以),说明为什么我不能将其作为公认的答案。
我试图了解一些与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)
Run Code Online (Sandbox Code Playgroud)
在这里,由于测试文件仅包含 100000 行,因此test.sed和test.awk …
bash ×4
sed ×2
awk ×1
command-line ×1
dash ×1
exit-status ×1
interrupt ×1
kill ×1
man ×1
performance ×1
quoting ×1
shell ×1
shell-script ×1
wildcards ×1