'!'
Linuxの記号または演算子は、論理否定として使用できます。 演算子、および微調整を使用して履歴からコマンドをフェッチするか、変更を加えて以前に実行したコマンドを実行します。以下のすべてのコマンドは、bashシェルで明示的にチェックされています。私はチェックしていませんが、これらのメジャーは他のシェルでは実行されません。ここでは、'!'
の驚くべき神秘的な使用法について説明します。 Linuxコマンドの記号または演算子。
1。コマンド番号で履歴からコマンドを実行します。
履歴からコマンドを実行できることに気付いていない可能性があります コマンド(すでに/以前に実行されたコマンド)。開始するには、まず「履歴」を実行してコマンド番号を見つけます ‘コマンド。
$ history
次に、履歴からコマンドを実行します 履歴の出力に表示される番号だけで 。番号1551に表示されるコマンドを実行するとします 「履歴」の出力 ‘コマンド。
$ !1551
そして、番号 1551 にリストされているコマンド(上記の場合はtopコマンド)を実行します。 。すでに実行されたコマンドを取得するこの方法は、コマンドが長い場合に特に役立ちます。 ![履歴コマンドの出力に表示される番号]を使用して呼び出す必要があります。 。
2。以前に実行したコマンドを最後から2番目のコマンド、最後から7番目のコマンドなどとして実行します。
最後に実行したコマンドが-1として表される実行シーケンスによって、以前に実行したコマンドを実行できます。 、最後から2番目の -2 、最後から7番目の -7 、…。
最初の実行履歴 最後に実行されたコマンドのリストを取得するコマンド。 履歴を実行する必要があります コマンド。これにより、 rm command> file
のようなコマンドがないことを確認できます。 誤って危険なコマンドを実行しないようにするためです。次に、最後から6番目のコマンド、最後から8番目のコマンド、最後から10番目のコマンドを確認します。
$ history $ !-6 $ !-8 $ !-10
3。実行した最後のコマンドの引数を、再入力せずに新しいコマンドに渡します
ディレクトリ「/home / $ USER / Binary / firefox」のコンテンツを一覧表示する必要があります 「だから私は解雇した。
$ ls /home/$USER/Binary/firefox
それから私は「ls-l」を解雇すべきだったことに気づきました ‘そこで実行可能なファイルを確認するには?したがって、コマンド全体をもう一度入力する必要があります。いいえ、必要ありません。この新しいコマンドの最後の引数を次のように実行する必要があります:
$ ls -l !$
ここで!$
最後のコマンドで渡された引数をこの新しいコマンドに渡します。
4。 (!)を使用して2つ以上の引数を処理する方法
テキストファイル1.txtを作成したとしましょう デスクトップ上。
$ touch /home/avi/Desktop/1.txt
次に、それを「 / home / avi / Downloads」にコピーします ‘ cpで両側に完全なパスを使用する コマンド。
$ 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”
を使用できます。 、お好きなようにご利用ください。すべての引数には、“!*”
からアクセスできます。 。
5。キーワードに基づいて最後のコマンドを実行します
キーワードに基づいて、最後に実行されたコマンドを実行できます。次のように理解できます:
$ 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
だけで実行済みのコマンドを実行していることに驚かれることでしょう。 キーワード。
6。のパワー !!オペレーター
(!!)
を使用して、最後の実行コマンドを実行/変更できます。 。現在のコマンドに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:commandnotfound」
というメッセージとともにエラーを返しました。 、rootとして実行する必要がある場所でこのコマンドをユーザーとして実行することを推測するのは難しくありませんでした。
では、解決策は何ですか? rootにログインしてから、コマンド全体をもう一度入力するのは困難です。また(UPナビゲーションキー )最後の例では、ここで救助に来ませんでした。それで? 「!!」
を呼び出す必要があります 引用符なしで、そのユーザーの最後のコマンドを呼び出します。
$ su -c “!!” root
ここでsu ルートであるスイッチユーザー、 -c
ユーザーとして特定のコマンドを実行することであり、最も重要な部分は !!
ここではコマンドに置き換えられ、最後の実行コマンドが置き換えられます。うん!ルートパスワードを入力する必要があります。
!!
を利用しています 主に次のシナリオで
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'
7。 ![FILE_NAME]
を除くすべてのファイルに影響するコマンドを実行します
!コード> (論理否定 )を使用して、
'!'
の背後にあるものを除くすべてのファイル/拡張子に対してコマンドを実行できます。 。
A。 名前が2.txtのファイルを除くすべてのファイルをディレクトリから削除します 。
$ rm !(2.txt)
B。 拡張子が「pdf」であるものを除いて、フォルダからすべてのファイルタイプを削除します ‘。
$ $ rm !(*.pdf)
8。ディレクトリ(たとえば/ home / avi / Tecmint)が存在するかどうかを確認しますか?上記のディレクトリが存在するかどうかをPrintfします。
ここでは'を使用します! -d'
ディレクトリが存在するかどうかを検証し、その後に論理AND演算子(&&)
が続く そのディレクトリを印刷するには存在せず、論理OR演算子(||)
ディレクトリを印刷するために存在します。
ロジックは、 [! -d / home / avi / Tecmint]
0です 、論理的な ANDを超えたものを実行します それ以外の場合は、論理OR (||)
に移動します 論理的なまたはの先にあるものを実行します 。
$ [ ! -d /home/avi/Tecmint ] && printf '\nno such /home/avi/Tecmint directory exist\n' || printf '\n/home/avi/Tecmint directory exist\n'
9。ディレクトリが存在するかどうかを確認しますか?コマンドを終了しない場合。
上記の条件と同様ですが、ここで目的のディレクトリが存在しない場合は、コマンドを終了します。
$ [ ! -d /home/avi/Tecmint ] && exit
10。ホームディレクトリが存在しない場合は、ホームディレクトリにディレクトリ(テストなど)を作成します。
スクリプト言語での一般的な実装。目的のディレクトリが存在しない場合は、ディレクトリが作成されます。
[ ! -d /home/avi/Tecmint ] && mkdir /home/avi/Tecmint
それは今のところすべてです。 '!'
のその他の使用法を知っているか、遭遇した場合 知っておく価値のあることですが、フィードバックで提案を提供してください。接続を維持してください!