Linuxコマンドでの(!)記号または演算子の10の驚くべき不思議な使用法


Linuxの '!' 記号または演算子は、論理否定演算子として使用できるだけでなく、微調整して履歴からコマンドをフェッチしたり、変更を加えて以前に実行したコマンドを実行したりすることもできます。以下のすべてのコマンドは、bashシェルで明示的にチェックされています。確認はしていませんが、これらの大部分は他のシェルでは実行されません。ここでは、Linuxコマンドでの '!' 記号または演算子の驚くべき不思議な使用法について説明します。

履歴コマンドからコマンドを実行できることに気付いていない可能性があります(すでに/以前に実行されたコマンド)。開始するには、まず「history」コマンドを実行してコマンド番号を見つけます。

$ history

次に、履歴の出力で、表示されている番号だけで履歴からコマンドを実行します。 「history」コマンドの出力の番号1551に表示されるコマンドを実行するとします。

$ !1551

そして、番号1551にリストされているコマンド(上記の場合はtopコマンド)を実行します。すでに実行されたコマンドを取得するこの方法は、コマンドが長い場合に特に役立ちます。 ![historyコマンドの出力に表示される番号]を使用して呼び出す必要があります。

以前に実行したコマンドは、実行シーケンスによって実行できます。最後の実行コマンドは-1として表され、最後から2番目は-2として、最後から7番目は-7として表されます。

最初に履歴コマンドを実行して、最後に実行されたコマンドのリストを取得します。誤って危険なコマンドを実行しないようにするために、 rm command> file などのコマンドがないことを確認するためにhistoryコマンドを実行する必要があります。次に、最後から6番目のコマンド、最後から8番目のコマンド、最後から10番目のコマンドを確認します。

$ history
$ !-6
$ !-8
$ !-10

ディレクトリ「/ home/Binary/firefox」のコンテンツを一覧表示する必要があるので、起動しました。

$ ls /home/$USER/Binary/firefox

次に、「ls -l」を起動して、そこで実行可能なファイルを確認する必要があることに気付きました。したがって、コマンド全体をもう一度入力する必要があります。いいえ、必要ありません。この新しいコマンドの最後の引数を次のように実行する必要があります。

$ ls -l !$

ここで、!$ は、最後のコマンドで渡された引数をこの新しいコマンドに伝達します。

デスクトップにテキストファイル1.txtを作成したとしましょう。

$ touch /home/avi/Desktop/1.txt

次に、cpコマンドでいずれかの側の完全なパスを使用して「/ home/avi/Downloads」にコピーします。

$ cp /home/avi/Desktop/1.txt /home/avi/downloads

これで、cpコマンドで2つの引数を渡しました。 1つ目は「/home/avi/Desktop/1.txt」、2つ目は「/ home/avi/Downloads」です。これらを異なる方法で処理できます。 echo [arguments] を実行するだけで、両方の引数を異なる方法で出力できます。

$ echo “1st Argument is : !^”
$ echo “2nd Argument is : !cp:2”

注最初の引数は“!^” として出力でき、残りの引数は“![Name_of_Command]:[Number_of_argument]” を実行することで出力できます。

上記の例では、最初のコマンドは「cp」であり、印刷するには2番目の引数が必要でした。したがって、“!cp:2” 、xyzが5つの引数で実行され、4番目の引数を取得する必要があるというコマンドがある場合は、“!xyz:4” を使用できます。好きなように使ってください。すべての引数には、“!*” からアクセスできます。

キーワードに基づいて、最後に実行されたコマンドを実行できます。私たちはそれを次のように理解することができます:

$ ls /home > /dev/null						[Command 1]
$ ls -l /home/avi/Desktop > /dev/null		                [Command 2]	
$ ls -la /home/avi/Downloads > /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 キーワードだけで実行済みのコマンドを実行していることに驚かれることでしょう。

(!!)を使用して、最後の実行コマンドを実行/変更できます。現在のコマンドのalter/tweakを使用して最後の実行コマンドを呼び出します。シナリオをお見せしましょう

昨日、ワンライナースクリプトを実行してプライベートIPを取得したので、次のように実行します。

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/

次に、突然、上記のスクリプトの出力をファイルip.txtにリダイレクトする必要があることがわかりました。どうすればよいですか?コマンド全体を再入力して、出力をファイルにリダイレクトする必要がありますか?簡単な解決策は、 UP ナビゲーションキーを使用し、 '> ip.txt' を追加して、出力をとしてファイルにリダイレクトすることです。

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/ > ip.txt

ここにある救世主の UP ナビゲーションキーに感謝します。次に、以下の条件を検討します。次に、ワンライナースクリプトの下で実行します。

$ ifconfig | grep "inet addr:" | awk '{print $2}' | grep -v '127.0.0.1' | cut -f2 -d:

スクリプトを実行するとすぐに、bashプロンプトが「bash:ifconfig:command notfound」というメッセージとともにエラーを返しました。このコマンドをユーザーとして実行する必要がある場所を推測するのは難しくありませんでした。ルートとして実行されます。

では、解決策は何ですか? rootにログインしてから、コマンド全体をもう一度入力するのは困難です。また、最後の例の(UPナビゲーションキー)はここで救助に来ませんでした。そう?引用符なしで“ !!” を呼び出す必要があります。これにより、そのユーザーの最後のコマンドが呼び出されます。

$ su -c “!!” root

ここで、suはrootであるswitch userであり、 -c はユーザーとして特定のコマンドを実行し、最も重要な部分 !! はコマンドと最後の実行コマンドに置き換えられますここで置き換えられます。うん! rootパスワードを入力する必要があります。

私は主に次のシナリオで !! を使用します。

1.通常のユーザーとしてapt-getコマンドを実行すると、通常、実行する権限がないというエラーが表示されます。

$ apt-get upgrade && apt-get dist-upgrade

Oppsエラー…成功するために以下のコマンドを実行することを心配しないでください。

$ su -c !!

私と同じように、

$ service apache2 start
or
$ /etc/init.d/apache2 start
or
$ systemctl start apache2

OOPSユーザーはそのようなタスクを実行する権限がないので、実行します。

$ su -c 'service apache2 start'
or
$ su -c '/etc/init.d/apache2 start'
or
$ su -c 'systemctl start apache2'

(論理NOT)を使用して、 '!' の背後にあるものを除くすべてのファイル/拡張子に対してコマンドを実行できます。

A.名前が2.txtであるものを除いて、ディレクトリからすべてのファイルを削除します。

$ rm !(2.txt)

B.拡張子が「pdf」のファイルを除くすべてのファイルタイプをフォルダから削除します。

$ $ rm !(*.pdf)

ここでは 'を使用します! -d 'は、ディレクトリが存在するかどうかを検証し、その後に論理積演算子(&&)が続き、そのディレクトリが存在しないことを出力し、論理OR演算子(||)が存在します。

ロジックは、 [! -d/home/avi/Tecmint] が0の場合、論理ORを超えているものを実行し、それ以外の場合は論理OR (||)に移動して、論理ORを超えているものを実行します。

$ [ ! -d /home/avi/Tecmint ] && printf '\nno such /home/avi/Tecmint directory exist\n' || printf '\n/home/avi/Tecmint directory exist\n'

上記の条件と同様ですが、ここで目的のディレクトリが存在しない場合は、コマンドを終了します。

$ [ ! -d /home/avi/Tecmint ] && exit

スクリプト言語での一般的な実装。目的のディレクトリが存在しない場合は、ディレクトリが作成されます。

[ ! -d /home/avi/Tecmint ] && mkdir /home/avi/Tecmint

それは今のところすべてです。知っておく価値のある '!' のその他の使用法を知っているか、見つけた場合は、フィードバックで提案を提供してください。接続を維持してください!