GNU/Linux >> Linux の 問題 >  >> Linux

Bash bangコマンド:Linuxコマンドラインの必知のトリック

sudoを発行するのを忘れた場合 コマンドの前に?タイプミスがあったためにコマンド全体を繰り返さなければならなかったことがありますか?以前のコマンドを繰り返すためのショートカットがあればいいと思ったことはありますか?これがあなたのように聞こえるなら、私は共有する何かがあります。この記事では、bash bang(!)の使用方法を紹介します。 )コマンド。コマンドを繰り返してエラーを修正するのが簡単になります。

コマンドリピートの基本

Bashは、以前に発行したコマンドのリストへのアクセスを提供します。これは、コマンド履歴と呼ばれます。 HISTSIZEの値 変数は、履歴リストに保存されるコマンドの数を設定します。デフォルトでは、この値は500です。これらの以前に発行されたコマンド(履歴リストと呼ばれます)は、履歴ファイルに保存されます。デフォルトの場所は~/.bash_historyです。 、この場所はシェル変数HISTFILEに保存されます 。

内部的には、bang(!)コマンドは、bash履歴リストからのコマンドを入力ストリームに導入します。この機能により、コマンドの繰り返し、テキストの置換、引数の操作、以前のコマンドのタイプミスの修正を簡単に行うことができます。

コマンドの繰り返しの例

これがbashbangでできることのいくつかの例です。

文字列の先頭に一致する最後のコマンドを繰り返します

強打(! )の後に、実行するコマンドに一致する最初の文字(または文字列)が続くと、そのコマンドの最新のインスタンスが繰り返されます。

$ ls
dir  dir1  dir2  file  file1  file2  hello.txt

$ !l
ls 
dir  dir1  dir2  file  file1  file2  hello.txt

$ !ls
ls 
dir  dir1  dir2  file  file1  file2  hello.txt

文字列内の任意の場所で一致する最後のコマンドを繰り返します

!?<string> formatは上記と同じですが、<string> コマンドの先頭にある必要はありません:

$ cat hello.txt 
Hello world ..!
$ !?hello.txt
cat hello.txt 
Hello world ..!
履歴からnコマンドを繰り返します

bash履歴からnコマンドを繰り返す(上からカウントダウンする)のは、問題の番号でバングを使用するのと同じくらい簡単です:

!10
最後の履歴エントリからn番目のコマンドを繰り返します

bash履歴からnコマンドを繰り返す(下から数える)のは、マイナスと問題の数字を使った強打を使用するのと同じくらい簡単です:

!-10

最後のコマンドを繰り返します

私がいつも使っているbangコマンドが1つあるとしたら、それは!!になります。 。バンバン(!! )コマンドは、履歴リストの最後のコマンドを繰り返し、!-1と同じように動作します。 :

$ cat hello.txt 
Hello world ..!
$ !!
cat hello.txt 
Hello world ..!

バンバン(!! )は、前のコマンドを繰り返す必要がある場合、またはsudoのプレフィックスを付ける必要がある場合に役立ちます。 、またはパイプ出力:

$ yum update
Loaded plugins: priorities, update-motd, upgrade-helper
You need to be root to perform this command.
$ sudo !!
sudo yum update
Loaded plugins: priorities, update-motd, upgrade-helper
$ ls
dir  dir1  dir2  file  file1  file2  hello.txt
$ !! | grep file
ls | grep file
file
file1
file2
$ 
繰り返しますが文字列を置き換えます

多くの場合、長いコマンドを発行して、別のスイッチで再発行します。または、前のコマンドにタイプミスがあったため、コマンドを再発行する必要があります。文字列の置換により、長いコマンド全体を再入力せずにこれを行うことができます。

この結果を達成するには2つの方法があります。 1つは次を使用することです:

!!:s^<old>^<new>

この構造は、前のコマンドの代わりに文字列を使用します:

$ ls /etc/httpd/conf.d
autoindex.conf  notrace.conf  php.conf  php-conf.7.2  README  userdir.conf  welcome.conf
$ !!:s^conf.d^conf
ls /etc/httpd/conf
httpd.conf  magic

!<string>:s^<old>^<new>でも同じことができます :

$ !l:s^conf^conf.d
ls /etc/httpd/conf.d
autoindex.conf  notrace.conf  php.conf  php-conf.7.2  README  userdir.conf  welcome.conf

このオプションは、最新ではないコマンドの文字列置換を行う必要がある場合に役立ちます。

この結果を達成するもう1つの方法は、構造体^<old>^<new>を使用することです。 。この形式は、!!:s^<old>^<new>のように、最新のコマンドを文字列に置き換えます。 :

$ cd /etc/httpd/conf.d
/etc/httpd/conf.d 
/etc/httpd/conf.d $ ^conf.d^conf
cd /etc/httpd/conf
/etc/httpd/conf $ 
コマンド引数を繰り返します

多くの場合、前のコマンドと同じ引数を使用します。長い引数がある場合は、次のコマンドでそれを繰り返したいと思うでしょう。これを実行できるbashbangコマンドをいくつか見てみましょう。

まず、フォーマット!:n 0を使用して、前のコマンドのn引数を繰り返します コマンド自体であること:

~/project $ ls -a -l 
total 32
drwxrwxr-x  7 user user 4096 Sep  9 20:30 .
drwx------ 16 user user 4096 Sep  9 20:10 ..
drwxrwxr-x  2 user user 4096 Sep  9 16:02 dir
drwxrwxr-x  2 user user 4096 Sep  9 16:02 dir1
drwxrwxr-x  2 user user 4096 Sep  9 16:02 dir2
drwxrwxr-x  2 user user 4096 Sep  9 20:30 dir3
-rw-rw-r--  1 user user    0 Sep  9 16:02 file
-rw-rw-r--  1 user user    0 Sep  5 16:07 .file
-rw-rw-r--  1 user user    0 Sep  9 16:01 file1
-rw-rw-r--  1 user user    0 Sep  9 16:01 file2
-rw-rw-r--  1 user user   16 Sep  9 16:03 hello.txt
drwxrwxr-x  2 user user 4096 Sep  5 16:08 .hidden_dir
-rw-rw-r--  1 user user    0 Sep  5 16:08 .hidden_file
~/project $ ls !:1
ls -a
.  ..  dir  dir1  dir2  dir3  file  .file  file1  file2  hello.txt  .hidden_dir  .hidden_file

次に、!!:$ 前のコマンドの最後の引数を繰り返します。このコマンドを!$に短縮できます および$_

project $ mkdir dir3
project $ cd !$
cd dir3
project/dir3 $ 

「以前に発行したコマンドでこの手法を使用したいが、最新のコマンドでは使用したくない場合はどうすればよいですか?」と質問するかもしれません。次のいずれかを使用して、bangコマンドでこれを行うことができます。

!<command you've issued previously >:$ 

$ mkdir -p hello/test1/test2
$ ls !mkdir:$
ls hello/test1/test2

または:

!<command you've issued previously >:n

$ ls !mk:2
ls hello/test1/test2
コマンドを印刷する

コマンドを印刷したいが、実行したくない場合があります。このタスクは!:pで実行できます :

~/project $ cat hello.txt 
Hello world ..!
~/project $ !:p
cat hello.txt 
~/project $ 

実際、履歴リスト内の任意のコマンドを実行せずに印刷できます。次のいずれかを発行するだけです:

$ !<command>:p

$ !mkdir:p
mkdir -p hello/test1/test2

$ !<string>:p

$ !su:p
sudo yum check-update
$ !mk:p
mkdir -p hello/test1/test2
reverse-i-searchを使用してコマンドを呼び出します

システム管理者は、おそらく毎日何百ものコマンドを発行します。一部のコマンドをリコールしたり、コマンドの一部をリコールしたりするのに苦労するかもしれません。必要なものを見つけるための別のオプションがあります。

(reverse-i-search)`<search string>’: <output> (reverse-i-search)`yu': sudo yum check-update
(reverse-i-search)`cd': cd /etc

CTRL + R reverse-i-searchをアクティブにします 、これは優れた検索領域を提供し、履歴をナビゲートするためのより簡単な方法を提供します。

結論

これらは便利なbashbang(! )すべてのシステム管理者が精通している必要があるコマンド。これらのコマンドは時間を大幅に節約し、コマンドエラーをすばやく修正する機能を提供します。コマンドman bashを使用して、manページでbashの詳細を確認してください。 。

[Red Hat Enterprise Linuxを試してみませんか?今すぐ無料でダウンロードしてください。]


Linux
  1. Linuxコマンドラインで牛を飼う

  2. Linuxコマンドラインにアクセスしてください

  3. コマンドラインでの毎日のBashのヒント

  1. Linuxコマンドラインに関する8つのヒント

  2. Yoda –Linuxシステム用のコマンドラインパーソナルアシスタント

  3. コマンドラインでVMを管理するための8つのLinuxvirshサブコマンド

  1. 4Linuxコマンドライン用のマークダウンツール

  2. Linuxコマンドラインでlsを使用してファイルを一覧表示するためのヒント

  3. Linux コマンド ラインの基本 – コマンド ラインからのコマンドの実行