'!' 기호를 사용하는 대부분의 Linux 명령 사용법은 셸마다 다를 수 있습니다. 내가 제공하는 예제는 일반적으로 bash 셸에서 사용되지만 일부 다른 Linux 셸에서는 구현이 다를 수도 있고 '!' 기호의 특정 용도를 전혀 지원하지 않을 수도 있습니다.
Linux 명령에서 '!' 기호의 놀랍고 신비한 용도에 대해 살펴보겠습니다.
유용한 팁은 이전에 실행한 명령에서 기록 명령을 찾아서 다시 실행할 수 있다는 것입니다. 먼저 'history' 명령을 실행하여 명령 번호를 찾습니다.
linuxmi@linuxmi:~/www.linuxmi.com$ history
Linux에서 최근 실행된 명령 찾기
기록에서 명령 번호별로 명령을 실행하려면 아래와 같이 '!' 기호 뒤에 명령 번호를 사용하면 됩니다.
$ !58
명령번호별로 명령어 실행
위 명령어를 실행하면 히스토리 58번째 줄에 있는 명령어가 실행됩니다.
실제 명령 번호는 명령 기록에 따라 다를 수 있다는 점에 유의하세요. History 명령을 사용하여 명령 목록과 해당 줄 번호를 볼 수 있습니다.
이전에 실행한 명령을 실행된 순서대로 실행할 수 있습니다. 실행된 두 번째 명령은 -2로 표시됩니다. 마지막에서 끝까지. 일곱 번째는 -7입니다. !-n을 사용할 수 있습니다. 여기서 n은 인용하려는 명령의 역수입니다. 아래와 같이
$ history$ !-3$ !-6$ !-10
Linux
'/home/linuxmi/snap' 디렉터리의 내용을 나열해야 합니다. , 그래서 다음 명령을 실행했습니다.
$ ls /home/linuxmi/snap
그런 다음 실행 가능한 파일을 확인하려면 "ls -l" 명령을 실행해야 한다는 것을 깨달았습니다. 전체 명령을 다시 입력하는 대신 다음과 같이 이전 명령에 전달된 매개변수를 이 새 명령에 전달하면 됩니다.
$ ls -l !$
여기서 '!$'는 이전 명령에 전달된 매개변수를 이 새 명령에 전달합니다.
바탕화면에 1.txt라는 텍스트 파일을 생성한다고 가정해 보겠습니다.
linuxmi@linuxmi ~/www.linuxmi.com% touch /home/linuxmi/linuxmi.go
그런 다음 전체 경로를 사용하여 cp 명령을 사용하여 '/home/avi/Downloads' 디렉터리에 복사하세요.
linuxmi@linuxmi ~/www.linuxmi.com% cp /home/linuxmi/linuxmi.go /home/linuxmi/go
이제 cp 명령에 두 개의 매개변수를 전달합니다. 첫 번째는 '/home/avi/Desktop/1.txt'이고 두 번째는 '/home/avi/Downloads'입니다. echo 명령을 실행하고 다른 매개변수를 사용하여 두 매개변수를 서로 다른 방식으로 인쇄할 수 있습니다.
linuxmi@linuxmi ~/www.linuxmi.com% echo "第一个参数是:!^"echo "第一个参数是:/home/linuxmi/linuxmi.go"第一个参数是:/home/linuxmi/linuxmi.golinuxmi@linuxmi ~/www.linuxmi.com% echo "第二个参数是:!cp:2"echo "第二个参数是:/home/linuxmi/go"第二个参数是:/home/linuxmi/go
첫 번째 매개변수는 "!^"로 표시될 수 있으며, 다른 매개변수는 "![명령 이름]:[매개변수 번호]"를 실행하여 인쇄할 수 있습니다.
위 예에서 첫 번째 명령은 'cp'이고 두 번째 매개변수를 인쇄해야 합니다. 따라서 "!cp:2"입니다. 5개의 매개변수가 있는 xyz 명령의 경우 4번째 매개변수를 가져와야 하는 경우 "!xyz:4"를 사용하고 필요에 따라 해당 매개변수를 사용할 수 있습니다. 모든 매개변수는 "!*"를 통해 액세스할 수 있습니다.
2개 이상의 매개변수 처리
키워드를 기반으로 최근 실행된 명령을 실행할 수 있습니다. 자세한 내용은 다음과 같습니다.
$ ls /home > /dev/null [Command 1]$ ls -l /home/linuxmi/linuxmi > /dev/null [Command 2] $ ls -la /home/linuxmi/linuxmi.com > /dev/null [Command 3]$ ls -lA /usr/bin > /dev/null [Command 4]
여기에서는 ls 명령을 사용했지만 옵션과 폴더가 다릅니다. 또한 콘솔을 깨끗하게 유지하기 위해 각 명령의 출력을 "/dev/null"로 보냅니다.
이제 키워드를 기반으로 마지막으로 실행된 명령을 실행합니다:
$ ! ls [Command 1]$ ! ls -l [Command 2] $ ! ls -la [Command 3]$ ! ls -lA [Command 4]
检查输出,你会惊讶地发现你正在运行已经执行过的命令,只是使用了ls关键词。
你可以使用(!!)操作符来运行/修改你上次执行的命令,这是一个简写符号,允许你引用在命令行中执行的上一个命令。
例如,我运行了一个单行脚本来查找Linux机器的IP地址:
$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/
然后突然我发现我需要将上述脚本的输出重定向到一个名为ip.txt的文件中,那么我该怎么办呢?我需要重新输入整个命令并将输出重定向到文件吗?好吧,一个简单的解决方案是使用上箭头键来调出上一条命令,并在末尾添加’> ip.txt’来将输出重定向到文件。
$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/ > ip.txt
感谢上箭头键的救命作用。现在考虑以下情况,下次我运行下面的单行脚本。
ifconfig | grep "inet addr:" | awk '{print $2}' | grep -v '127.0.0.1' | cut -f2 -d:
当我运行脚本时,bash提示返回了一个错误,信息为“bash: ifconfig: command not found”,我很容易猜到我以一个普通用户的身份运行了这个命令,而它应该以root身份运行。
那么解决办法是什么呢?登录为root然后重新输入整个命令是很困难的!在上一个示例中的(上箭头键)在这里也无法帮助。所以,要调用用户的最后一个命令,需要输入“!!”(不需要引号)
su -c “!!” root
这里的su是切换用户的命令,root是要切换到的用户,-c是以指定的用户身份运行命令的选项,最重要的部分是!!将被替换为上次运行的命令。是的!你需要提供root密码。
在Linux中,’!’操作符(也称为”bang”操作符)用于历史扩展,它允许你引用先前的命令并对其执行各种操作。要从目录中删除除了特定文件(important_file.txt)之外的所有文件,可以使用带有’!’操作符的rm命令,如下所示。
$ rm !(important_file.txt)
要从文件夹中删除除了扩展名为’.pdf’之外的所有文件类型。
$ $ rm !(*.pdf)
在这里,我们将使用’! -d’来验证目录是否存在,如果目录不存在,则紧随其后的是逻辑与操作符(&&),打印出目录不存在,如果目录存在,则紧随其后的是逻辑或操作符(||),打印出目录存在。
逻辑是,当[ ! -d /home/linuxmi/linuxmi.com ]的输出为0时,它将执行逻辑与之后的内容,否则它将转到逻辑或(||)并执行逻辑或之后的内容。
$ [ ! -d /home/linuxmi/linuxmi.com ] && printf '\nno such /home/linuxmi/linuxmi.com directory exist\n' || printf '\n/home/linuxmi/linuxmi.com directory exist\n'
类似于上面的条件,但是如果所需目录不存在,它将退出命令。
$ [ ! -d /home/linuxmi/linuxmi.com] && exit
在脚本语言中的一般实现,如果所需目录不存在,它将创建一个目录。
[ ! -d /home/linuxmi/linuxmi.com] && mkdir /home/linuxmi/linuxmi.com
위 내용은 Linux 명령에서 '!' 연산자의 8가지 신비한 용도의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!