分享您的 Unix/Linux 命令行功能和技巧。如果可能的话,尽量保持它的外壳/发行版不可知。有兴趣查看别名、单行、键盘快捷键、小 shell 脚本等。
有人知道为什么 bash 仍然默认启用历史替换吗?我的.bashrc已经包含set +H很多年了,但其他一些人仍然被这个功能所吸引。
鉴于几乎每个人都使用具有复制粘贴功能的终端,并且使用readline库编译的 bash和历史替换在默认情况下仅在交互式 shell 中启用,真的有任何理由拥有该功能吗?即使默认情况下为所有 shell 禁用此功能,也不会破坏现有脚本。
如果你不知道为什么历史替换被破坏,试试这个:
$ set +H # disable feature history substitution
$ echo "WTF???!?!!?"
WTF???!?!!?
$ set -H # enable feature history substitution
$ echo "WTF???!?!!?"
echo WTF???echo WTF???!?!!?
WTF???echo WTF???!?!!?
Run Code Online (Sandbox Code Playgroud)
(显然,如果默认情况下所有脚本都禁用该功能,并且存在一个功能可以在执行之前验证结果,则该功能存在重大问题:shopt -s histverify。)
也可以看看:
如果我输入:
echo "Hello, World!"
Run Code Online (Sandbox Code Playgroud)
我不知道它的名字,但它提示我输入下一行。你知道这PS2件事。或者,如果您键入echo \并按Enter。
为什么?
嗯,我知道这!是一个特殊变量,您可以使用它来引用您的历史记录。
但一旦我使用这个:
echo "Hello, World"!
Run Code Online (Sandbox Code Playgroud)
我得到了我想要的输出。发生了什么事,为什么不能!在内部使用""?
感谢您的帮助 :)
运行echo "Hello world!"在bash:
# echo "Hello world!"
-bash: !": event not found
Run Code Online (Sandbox Code Playgroud)
为什么 bash 会抱怨“ !": event not found”?不!,一切正常:
# echo "Hello world"
Hello world
Run Code Online (Sandbox Code Playgroud)
更新:我的bash版本:
# bash --version
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)
Run Code Online (Sandbox Code Playgroud) 如果我跑
grep "!" test.txt
Run Code Online (Sandbox Code Playgroud)
它会显示错误
bash: !: 事件未找到
好吧,我知道我实际上应该使用grep '!'. 但是如何理解上面的错误呢?
我知道!是 bash 特殊字符。根据http://mywiki.wooledge.org/Quotes。
双引号:"..." 阻止某些替换,但允许其他替换。执行每个以美元符号 $ 开头的替换,以及遗留
...(反引号)命令替换。还执行反斜杠转义。不执行分词或文件名扩展。
它没有提到双引号会影响 !。有人可以解释一下 bash 或 grep 是如何解释的grep "!"吗?什么是“事件”?
我正在使用终端编写 Java 程序printf并将其输出重定向到.java文件,但printf无法解释水平反斜杠选项卡 ( \t),并且当我在字符串中有感叹号 (!) 时,它甚至不打印并失败这个错误:
bash: !": event not found
如何强制 printf 包含水平制表符?
以及如何在不出现上述错误的情况下包含感叹号?
$ printf "%s\n" "public class {" "\tpublic static void main(String[] args) {" "dogBark()" "}" "public static void dogBark() {" "System.out.println("Woof")" "}" "}" > barkingDog.java
Run Code Online (Sandbox Code Playgroud)
.java文件输出$ less barkingDog.java
public class {
\tpublic static void main(String[] args) {
dogBark()
}
public static void dogBark() {
System.out.println(Woof)
}
}
Run Code Online (Sandbox Code Playgroud) 当我!用作字段分隔符时,例如awk -F!它会给出错误消息bash: !: event not found。为什么?它正在接受awk -F"\!"。Bash 版本 3.2.25
我在脚本中有一行可以工作,但不能从命令行工作。
echo "User ALL = NOPASSWD: ALL, !/bin/su" | sudo tee -a /etc/sudoers
[user@localhost ~]$ echo "test ALL = NOPASSWD: ALL, !/bin/su" | sudo tee -a /etc/sudoers
bash: !/bin/su": event not found
[user@localhost ~]$
Run Code Online (Sandbox Code Playgroud)
编辑:我正在尝试添加一个没有su命令权限的 sudo 用户,而 sudo 用户使用sudo -i. 我只是检查该脚本中的每个命令,看看它们在命令行中是如何工作的。
我在命令行中找到了一个解决方法,我必须使用"'!'"/bin/su. 那么有人可以帮助解释为什么这在命令行中不起作用吗?