相关疑难解决方法(0)

您最喜欢的命令行功能或技巧是什么?

分享您的 Unix/Linux 命令行功能和技巧。如果可能的话,尽量保持它的外壳/发行版不可知。有兴趣查看别名、单行、键盘快捷键、小 shell 脚本等。

command-line shell

93
推荐指数
27
解决办法
5万
查看次数

为什么默认情况下仍然启用 bash 历史替换?

有人知道为什么 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。)

也可以看看:

bash history-expansion

18
推荐指数
3
解决办法
2920
查看次数

回响着“!” 字符串内部做了一些奇怪的事情

如果我输入:

echo "Hello, World!"
Run Code Online (Sandbox Code Playgroud)

我不知道它的名字,但它提示我输入下一行。你知道这PS2件事。或者,如果您键入echo \并按Enter

为什么?

嗯,我知道这!是一个特殊变量,您可以使用它来引用您的历史记录。

但一旦我使用这个:

echo "Hello, World"!
Run Code Online (Sandbox Code Playgroud)

我得到了我想要的输出。发生了什么事,为什么不能!在内部使用""


感谢您的帮助 :)

bash command-history zsh quoting history-expansion

7
推荐指数
2
解决办法
939
查看次数

为什么 bash 会抱怨“!”:找不到事件”?

运行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)

linux bash

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

为什么grep“!” 显示“bash: !: event not found”?

如果我跑

grep "!" test.txt
Run Code Online (Sandbox Code Playgroud)

它会显示错误

bash: !: 事件未找到

好吧,我知道我实际上应该使用grep '!'. 但是如何理解上面的错误呢?

我知道!是 bash 特殊字符。根据http://mywiki.wooledge.org/Quotes

双引号:"..." 阻止某些替换,但允许其他替换。执行每个以美元符号 $ 开头的替换,以及遗留...(反引号)命令替换。还执行反斜杠转义。不执行分词或文件名扩展。

它没有提到双引号会影响 !。有人可以解释一下 bash 或 grep 是如何解释的grep "!"吗?什么是“事件”?

grep bash special-characters

4
推荐指数
1
解决办法
4801
查看次数

printf 无法解释反斜杠和感叹号

我正在使用终端编写 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)

command-line bash quoting printf

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

为什么awk不接受!作为字段分隔符?

当我!用作字段分隔符时,例如awk -F!它会给出错误消息bash: !: event not found。为什么?它正在接受awk -F"\!"。Bash 版本 3.2.25

awk

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

"bash: !/bin/su": 事件未找到"

我在脚本中有一行可以工作,但不能从命令行工作。

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. 那么有人可以帮助解释为什么这在命令行中不起作用吗?

bash command-history special-characters quoting

-1
推荐指数
1
解决办法
1195
查看次数