Linux命令行下感叹号的几个用法

本文详细介绍了Linux命令行中'!'的多种用途,包括执行历史命令、复用历史参数和逻辑取反。通过!!快速执行上一条命令,使用!n调用指定历史命令,!cmd和!cmd:n获取历史命令参数,以及在逻辑判断中的取反应用。这些技巧能显著提高Linux命令行操作效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux命令行下 " ! " 的几个用法

! 在大多数编程语言中表示取反的意思,但是在命令行中,他还有一些其他的神奇用法。熟练掌握这些用法,可以大大提高我们日常命令行操作的效率。

1 执行历史命令

!!

! 在命令行中可以用来执行历史命令,最常用的,大家应该比较熟悉的是执行上一条命令 !!,它可以用来执行最近的一条命令

该命令在我们忘记使用 root 权限执行某项命令时很有用:sudo !! 在上一条命令之前加 root 权限再执行。

比如,我们要用 fdisk 命令查看磁盘信息,但是如果没有 root 权限是会被拒绝的,这时我们就可以直接 sudo !!

$ fdisk -l
fdisk: cannot open /dev/loop0: Permission denied
# ...
fdisk: cannot open /dev/loop30: Permission denied
fdisk: cannot open /dev/loop31: Permission denied
$ sudo !!
sudo fdisk -l
[sudo] password for song:
Disk /dev/loop0: 4.2 MiB, 4448256 bytes, 8688 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
# ...

或者在我们忘记加某项参数时,也可以通过 !! -p 来快速添加参数执行上一条命令。比如我要 gdb 调试某个源文件,但是忘了加 -g 参数,即可:

g++ quickSort.cpp
!! -g

有趣的是,!! 符号可以理解为完整地重复上一条指令的文本,即使在有些时候语义不连贯也是可行的。比如下面这个情景。

在当前目录下,我们有 tsne.py 和 tsne.png 两个文件,这时我想要 vim 修改 tsne.py 的内容,很有可能会手快通过 tab 键执行这样的命令:vim tsne.p,这时我们可以直接 !!y,就能顺利地执行 vim tsne.py

!n

!! 命令虽然很好用,但是它只能执行上面最近一条命令,那么能不能执行上面几条(如倒数第二条、倒数第三条)指令呢,又能不能有一个一般的命令,来执行某一条历史命令呢?当然是有的!

首先,我们知道 history 命令可以查看最近的历史命令。值得注意的是,它显示的每条历史命令之前会有一个编号,我们好像在平常没太注意过这个编号有什么作用:

$ history
 2083  ls
 2084  vim quickSort.cpp
 2085  g++ quickSort.cpp
 2086  g++ quickSort.cpp  -g
 2087  history

实际上,我们可以直接通过这个编号来执行某条历史命令,如 !2084

这个用法好像比较鸡肋,因为历史命令编号我们很少回去记住它,每次要用 history 命令查,再执行的话未免有些麻烦。笔者一时能想到的应用场景是如果我们在一段时间(比如一小时、一下午)内,要重复的用某条超复杂的命令(比如很长的路径名),我们不妨短时记忆一下某个历史命令编号,并多次使用该编号执行历史命令。

比如我今天下午调试程序时要多次修改某个 py 文件,就可以记住这个命令的编号,然后每次 !1994 来执行历史命令。

 1994  vim /home/ps/JJ_Projects/ssl_transformer_aes/my_project/SiT/pretrain_ssl.sh

!-i

!-i 的形式可以执行倒数第 i 条命令。如 !-6!-8等。特别地,!-1 就相当于 !!

!cmd

!cmd 通过关键词来执行历史命令。可以按照下面的命令来理解:

$ ls /home > /dev/null
$ ls -l /home/song/JJ_Projects/ > /dev/null
$ ls -la /home/song/JJ_Projects/ > /dev/null
$ ls -lA /usr/bin > /dev/null

上面是相同的ls命令对应了不同参数和文件夹。此外我们将每一个标准输出都传递到了 /dev/null 因为我们并不希望处理程序的标准输出。现在我们可以调用命令的关键词来实现它们。

$ !ls
$ !ls -l
$ !ls -la
$ !ls -lA

当你使用 !ls 关键词来执行之前命令的时候,你一定会被标准输出给惊讶到。

2 复用历史参数

!$和!^

如同 !! 来执行上一条命令一样,!$!^ 也是很常用的,它们的作用是重复上一条命令的第一个或最后一个参数

!$ 为例,考虑这样的场景,我要删除某个目录下的所有 png 图像文件,但是在删除之前,我要先查看一下,确定这些图像文件确实都是没有用的。可以这样操作:

ls /home/song/JJ_Projects/ava-mlsp/metadata/*.png
rm !$

这样能省去我们重复上一个命令操作参数的时间。

另一个更普遍的场景:当我们编辑完 ~/.bashrc 文件后,需要用 source 命令使它生效,此时可以:

vim ~/.bashrc
# 一顿操作,修改 .bashrc 文件内容
source !$

!cmd:n

同样的,我们将 !$!^ 推广到一般情况,!cmd:n :获取最近一次 cmd 命令的第 n 个参数(参数的个数从 0 开始计)。

如:

ls -a -l
ls !ls:1 	

这样后面一条命令相当于执行了:ls -l

3 取反

! 在很多编程语言中都是取反的意思,!= 也通常都是不等于的意思。

在逻辑判断中取反

同大多数编程语言一样,! 在 shell 脚本中表示取反的意思。

[ ! -d /home/song/JJ_Prjects ] 可以用来判断该目录是否为空。

在命令中取反

rm !(train.py) 可以删除当前目录下除了 train.py 之外的全部文件。rm !(*.png) 删除当前目录下除了后缀名为 png 之外的全部文件。

总结起来最常用的除了在编程时取反之外,在命令行中用起来比较丝滑的也就是 !!!$,它们的推广的更一般的形式虽然能实现的功能更全面,但稍显麻烦,不太常用。以上就是笔者对 ! 在命令行中使用的总结了,如果有错误或补充,欢迎留言讨论。

Ref:

https://linuxstory.org/mysterious-ten-operator-in-linux/

### VMware虚拟机网络连接故障解决方案 当遇到VMware虚拟机网络连接问题时,可能涉及多个方面的原因分析和排查方法。以下是针对网络图标没有感叹号相关的配置或故障的具体解决方案。 #### 1. DNS服务器异常导致的解析失败 如果目标域名无法正常解析,可能是由于DNS服务器配置错误或者停机引起的。可以尝试修改虚拟机中的DNS设置为公共DNS服务器地址(如Google的8.8.8.8),从而验证是否存在DNS解析问题[^1]。 ```bash # 修改Linux系统的DNS配置文件 vi /etc/resolv.conf # 添以下内容 nameserver 8.8.8.8 nameserver 8.8.4.4 ``` 对于Windows系统,则可以通过控制面板->网络和共享中心->更改适配器设置->属性->Internet协议版本4 (TCP/IPv4)->手动填写DNS服务器地址来完成配置。 --- #### 2. Windows系统本身的文件缺失问题 某些情况下,VMware服务可能会因为缺少必要的依赖文件而终止运行。这种现象通常伴随着“系统找不到指定的文件”的错误提示。建议按照以下步骤操作: - 查看系统事件日志以定位具体错误信息; - 使用命令行工具重新注册相关DLL文件并修复潜在损坏; ```cmd sfc /scannow regsvr32 vmGuestLib.dll ``` 上述命令可以帮助恢复部分丢失的功能模块[^2]。 --- #### 3. 桥接模式下的网络配置调整 桥接模式允许虚拟机通过宿主机直接访问外部真实网络环境。然而,在实际应用过程中需要注意以下几个要点: - 宿主机上的网卡驱动程序需保持最新状态以防兼容性冲突; - 如果启用了防火墙规则,请确认其不会阻止来自虚拟客户端的数据包传输; - 正确分配静态IP给每台机器以免发生地址重复的情况[^3]。 > **注意**: 当采用此方式时,务必保证物理层面上已成功建立有效的链路连通性。 --- #### 4. SVN Adapter硬件检测与重置 有时即使安装好了SecoClient软件之后仍然看不到预期中的SVN Adapter设备列表项,这时候就需要执行一次强制性的硬件扫描动作以便让操作系统能够识别新增出来的组件资源。另外也要留意是否有任何警告标志存在于此项目旁边——如果有则表明当状态下该装置可能存在某种形式的技术障碍亟待排除[^4]。 ```cmd devmgmt.msc ``` 打开设备管理窗口后找到对应条目右击菜单里选取更新驱动选项即可触发新一轮搜寻过程。 --- ### 总结 综上所述,解决VMware虚拟机网络连接故障可以从四个方面入手:一是检查DNS服务器是否工作正常;二是处理好可能出现的服务端口被占用或是关键路径遗失等问题;三是合理运用桥接技术实现无缝对接外网需求;四是确保所有附设施均处于良好运转之中无明显缺陷表现出来影响整体性能发挥效果最佳。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值