シェルが異なると、「!」記号を使用するほとんどの Linux コマンドの使用方法が異なる場合があります。私が提供する例は通常 bash シェルで使用されますが、他の一部の Linux シェルでは実装が異なる場合や、「!」記号の特定の使用をまったくサポートしていない場合があります。
Linux コマンドにおける「!」記号の驚くべき謎に満ちた使用法について詳しく見ていきましょう。
役立つヒントは、コマンドを実行できることです。以前に実行されたコマンドから履歴コマンドを見つけて、再度実行します。まず、「history」コマンドを実行してコマンドの番号を見つけます。
linuxmi@linuxmi:~/www.linuxmi.com$ history
Linux で最近実行したコマンドを検索する
コマンド番号に基づいて履歴からコマンドを実行するには、「!」記号の後にコマンドを使用します。番号は以下の通り。
$ !58
コマンド番号でコマンドを実行
上記のコマンドを実行すると、履歴の 58 行目のコマンドが実行されます。
実際のコマンド番号はコマンド履歴によって異なる場合があることに注意してください。 History コマンドを使用すると、コマンドとその行番号のリストを表示できます。
以前に実行したコマンドを、実行された順序で実行できます。最後のコマンド実行は - として表されます。 1、最後から 2 番目は -2、最後から 7 番目は -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 コマンドに 2 つのパラメータを渡します。 1 つ目は「/home/avi/Desktop/1.txt」、2 つ目は「/home/avi/Downloads」です。 echo コマンドを実行し、異なるパラメーターを使用することで、2 つのパラメーターを異なる方法で出力できます。
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」で、2 番目のパラメータを出力する必要があります。したがって、「!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 中国語 Web サイトの他の関連記事を参照してください。