2017-09-22 119 views
1

\!在bash命令中的作用是什么?!在Bash命令中

例如,我发现下面这个命令将在不同的行为与\!

find subdir -lname 'test*' \! -newer somethinghere

谷歌搜索似乎并没有带来任何东西具体涉及到\!除了命令行格式。

+3

'\!'被用来逃避'!'这会导致历史扩展否则 – anubhava

+0

堆栈溢出是编程和开发问题的网站。这个问题似乎与题目无关,因为它不涉及编程或开发。请参阅帮助中心的[我可以询问哪些主题](http://stackoverflow.com/help/on-topic)。也许[超级用户](http://superuser.com/)或[Unix&Linux堆栈交换](http://unix.stackexchange.com/)会是一个更好的地方。 – jww

回答

3

在字符转义之前加一个反斜杠,防止它被解析为语法。因此,\!是一个相当于'!'的terser - 它确保find作为参数传递给!,而shell不会以任何方式解释它。

没有任一这些,如果[[ $- = *H* ]](其是真的在交互式壳和默认情况下),并且如果是histchars从其默认值未修饰,!触发历史扩展。这是每次bash的手册页的QUOTING部分:

当使用命令行历史扩展功能(见下文历史扩展),历史扩展字符,通常是!,必须被引用,以防止历史扩展。

1

这个!是否定,例如:

find . -readable 

将返回所有可读的文件/目录,而

find . ! -readable 

将返回所有的文件/文件可以读取(断链或目录 - r许可)

\字符是逃避。

但是,好奇地在我的电脑上(Debian/bash)我需要逃避* char但不是!一。为了更加明确我需要写

find . -name abc\* 

find . -name abc\* ! -readable 
find . -name abc\* \! -readable 

工作,并具有同样的效果

+1

不那么好奇。旧式的历史扩展并不总是能够实现的 - 个人而言,我在设置点文件时所做的第一件事就是关闭它。它在非交互式shell(即运行脚本)中总是被默认禁用。 –

+0

@CharlesDuffy感谢您的澄清 –