多くのLinuxおよびUnixバリアントのデフォルトのシェルとして、Bashにはさまざまな十分に活用されていない機能が含まれているため、何を議論するかを決めるのは困難でした。最終的に、私は日常の活動を容易にするBashのヒントに焦点を当てることにしました。
コンサルタントとして、私は複数の多様な環境と働き方を見ています。私はこの経験を利用して、ヒントを4つの広いカテゴリに絞り込みました。ターミナルとラインのトリック、ナビゲーションとファイル、履歴、および役立つコマンドです。これらのカテゴリは完全に恣意的であり、あらゆる種類の決定的な分類としてよりも、私自身の考えを整理するのに役立ちます。ここに含まれるヒントの多くは、主観的に複数のカテゴリに当てはまる可能性があります。
面倒なことはありませんが、これが私が遭遇した最も役立つBashのトリックのいくつかです。
Bash履歴の操作
生産性を向上させる最良の方法の1つは、Bashの履歴をより効果的に使用する方法を学ぶことです。そのことを念頭に置いて、マルチユーザー環境で行うことができる最も重要な調整の1つは、histappend
を有効にすることです。 あなたのシェルへのオプション。これを行うには、次のコマンドを実行するだけです。
shopt -s histappend
これにより、複数の端末セッションが同時に履歴に書き込むことができます。ほとんどの環境では、このオプションはではありません 有効。つまり、(ローカルまたはSSH経由で)複数のBashセッションを開いていると、履歴が失われることがよくあります。
もう1つの一般的なタスクは、sudo
を使用して最後のコマンドを繰り返すことです。 。たとえば、ディレクトリmkdir /etc/ansible/facts.d
を作成するとします。 。ルートでない限り、このコマンドは失敗します。私が観察したところによると、ほとんどのユーザーはup
をヒットしています 矢印をクリックし、行の先頭までスクロールして、sudo
を追加します 指図。もっと簡単な方法があります。次のようなコマンドを実行するだけです:
sudo !!
Bashはsudo
を実行します 次に、前のコマンド全体。順番に実行すると、次のようになります。
[user@centos ~]$ mkdir -p /etc/ansible/facts.d
mkdir: cannot create directory ‘/etc/ansible’: Permission denied
[user@centos ~]$ sudo !!
sudo mkdir -p /etc/ansible/facts.d
!!
の場合 が実行されると、コマンド全体が端末にエコーアウトされるため、何が実行されたかがわかります。
!*
も同様ですが、使用頻度ははるかに低くなっています。 ショートカット。これは、すべての*引数*が必要であることをBashに通知します。 前のコマンドから現在のコマンドで繰り返されます。これは、再利用したい引数がたくさんあるコマンドに役立つ可能性があります。簡単な例は、一連のファイルを作成してから、それらのファイルのアクセス許可を変更することです。
[user@centos tmp]$ touch file1 file2 file3 file4
[user@centos tmp]$ chmod 777 !*
chmod 777 file1 file2 file3 file4
特定の状況でのみ便利ですが、キーストロークを節約できる場合があります。
キーストロークの保存と言えば、履歴からコマンドを見つけることについて話しましょう。ほとんどのユーザーは次のようなことをします:
history |grep <some command>
ただし、履歴を検索する簡単な方法があります。を押すと
ctrl + r
Bashはあなたの履歴の逆検索を行います。入力を開始すると、結果が表示され始めます。例:
(reverse-i-search)`hist': shopt -s histappend
上記の例では、hist
と入力しました shopt
と一致しました 前に説明したコマンド。 ctrl + r
を押し続ける場合 、Bashは、他のすべての一致を逆方向に検索し続けます。
最後のトリックは、履歴で最も使用されたコマンドをカウントして表示するために使用できる便利なコマンドほどのトリックではありません。
[user@centos tmp]$ history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head
81 ssh
50 sudo
46 ls
45 ping
39 cd
29 nvidia-xrun
20 nmap
19 export
この例では、ssh
であることがわかります。 現時点で私の歴史の中で群を抜いて最も使用されているコマンドです。
ナビゲーションとファイルの命名
その他のLinuxリソース
- Linuxコマンドのチートシート
- 高度なLinuxコマンドのチートシート
- 無料のオンラインコース:RHELの技術概要
- Linuxネットワーキングのチートシート
- SELinuxチートシート
- Linuxの一般的なコマンドのチートシート
- Linuxコンテナとは何ですか?
- 最新のLinux記事
コマンド、ファイル名、またはフォルダ名を入力すると、tab
を押すことができることをすでにご存知でしょう。 一度キーを押して、文言を完成させます。これは、完全に一致するものが1つある場合に機能します。ただし、tab
を押すと、それがわからない場合があります。 2回、入力内容に基づいてすべての一致が表示されます。例:
[user@centos tmp]$ cd /lib <tab><tab>
lib/ lib64/
これは、ファイルシステムのナビゲーションに非常に役立ちます。もう1つの役立つトリックは、cdspell
を有効にすることです。 あなたの殻の中で。これを行うには、shopt -s cdspell
を発行します。 指図。これはタイプミスの修正に役立ちます:
[user@centos etc]$ cd /tpm
/tmp
[user@centos tmp]$ cd /ect
/etc
完璧ではありませんが、少しでも役に立ちます!
ディレクトリを正常に変更したら、以前のディレクトリに戻る必要がある場合はどうなりますか?ディレクトリツリーにあまり詳しくない場合、これは大したことではありません。ただし、/var/lib/flatpak/exports/share/applications/
などのかなり深いパスにいる場合 、次のように入力できます:
cd /va<tab>/lib/fla<tab>/ex<tab>/sh<tab>/app<tab>
幸い、Bashは以前のディレクトリを記憶しているので、cd -
と入力するだけでそこに戻ることができます。 。表示は次のとおりです。
[user@centos applications]$ pwd
/var/lib/flatpak/exports/share/applications
[user@centos applications]$ cd /tmp
[user@centos tmp]$ pwd
/tmp
[user@centos tmp]$ cd -
/var/lib/flatpak/exports/share/applications
それはすべてうまくいっていますが、簡単にナビゲートしたいディレクトリがたくさんある場合はどうでしょうか。 Bashはそこでもカバーしています。より効果的にナビゲートするのに役立つ設定可能な変数があります。次に例を示します:
[user@centos applications]$ export CDPATH='~:/var/log:/etc'
[user@centos applications]$ cd hp
/etc/hp
[user@centos hp]$ cd Downloads
/home/user/Downloads
[user@centos Downloads]$ cd ansible
/etc/ansible
[user@centos Downloads]$ cd journal
/var/log/journal
上記の例では、ホームディレクトリを設定しました(チルダで示されています:~
)、/var/log
および/etc
。これらのディレクトリの最上位にあるものはすべて、それらを参照すると自動的に入力されます。 CDPATH
にリストされているディレクトリのベースにないディレクトリ 見つかりません。たとえば、目的のディレクトリが/etc/ansible/facts.d/
だった場合 これは、cd facts.d
と入力しても完了しません。 。これは、ディレクトリがansible
であるためです。 /etc
の下にあります 、facts.d
ではありません。したがって、CDPATH
頻繁にアクセスするツリーの最上位に到達するのに便利ですが、大きなフォルダ構造を参照している場合は管理が面倒になる可能性があります。
最後に、ある時点で誰もが行う2つの一般的な使用例について説明しましょう。ファイル拡張子の変更とファイルの名前変更です。一見、これは同じように聞こえるかもしれませんが、Bashはこれらのタスクを実行するためのいくつかの異なるトリックを提供します。
これは「下品な」操作かもしれませんが、ほとんどのユーザーは、ある時点で、作業中のファイルのクイックコピーを作成する必要があります。ほとんどの場合、ファイル名を正確にコピーし、.old
のようなファイル拡張子を追加するだけです。 または.bak
。 Bashにはこれに対する簡単なショートカットがあります。 spideroak_inotify_db.07pkh3
のようなファイル名があるとします。 のコピーを保持したいこと。次のように入力できます:
cp spideroak_inotify_db.07pkh3 spideroak_inotify_db.07pkh3.bak
コピー/貼り付け操作を使用するか、タブを完了するか、ショートカットの1つを使用して引数を繰り返すか、または単にすべてを入力することで、これをすばやく処理できます。ただし、以下のコマンドは、入力に慣れるとさらに速くなるはずです。
cp spideroak_inotify_db.07pkh3{,.old}
これは(ご想像のとおり).old
を追加してファイルをコピーします ファイルのファイル拡張子。それは素晴らしいことですが、一度に多数のファイルの名前を変更したいと思います。確かに、できた これらを処理するためにforループを記述します(実際、私はこれを複雑なものに対して行うことがよくあります)が、rename
と呼ばれる便利なユーティリティがあるのになぜそうするのでしょうか。 ?このユーティリティの使用法には、Debian/UbuntuとCentOS/Archの間でいくつかの違いがあります。 Debianベースの名前変更はSEDのような構文を使用します:
user@ubuntu-1604:/tmp$ for x in `seq 1 5`; do touch old_text_file_${x}.txt; done
user@ubuntu-1604:/tmp$ ls old_text_file_*
old_text_file_1.txt old_text_file_3.txt old_text_file_5.txt
old_text_file_2.txt old_text_file_4.txt
user@ubuntu-1604:/tmp$ rename 's/old_text_file/shiney_new_doc/' *.txt
user@ubuntu-1604:/tmp$ ls shiney_new_doc_*
shiney_new_doc_1.txt shiney_new_doc_3.txt shiney_new_doc_5.txt
shiney_new_doc_2.txt shiney_new_doc_4.txt
CentOSまたはArchボックスでは、次のようになります。
[user@centos /tmp]$ for x in `seq 1 5`; do touch old_text_file_${x}.txt; done
[user@centos /tmp]$ ls old_text_file_*
old_text_file_1.txt old_text_file_3.txt old_text_file_5.txt
old_text_file_2.txt old_text_file_4.txt
[user@centos tmp]$ rename old_text_file centos_new_doc *.txt
[user@centos tmp]$ ls centos_new_doc_*
centos_new_doc_1.txt centos_new_doc_3.txt centos_new_doc_5.txt
centos_new_doc_2.txt centos_new_doc_4.txt
Bashキーバインディング
Bashには多くの組み込みのキーボードショートカットがあります。 bind -p
と入力すると、それらのリストを見つけることができます。 。よく知られているものもありますが、いくつかを強調表示すると便利だと思いました。
- ctrl + _ (元に戻す)
- ctrl + t (2文字を入れ替える)
- ALT + t (2つの単語を入れ替える)
- ALT+。 (前のコマンドの最後の引数を出力します)
- ctrl + x + * (グロブ/スターを展開)
- Ctrl+矢印 (単語を前に進めます)
- ALT + f (単語を前に進めます)
- ALT + b (単語を後ろに移動します)
- ctrl + x 続いてctrl+ e (コマンド文字列をエディタで開いて、実行前に編集できるようにします)
- ctrl + e (カーソルを最後まで移動します)
- ctrl + a (カーソルを移動して開始します)
- ctrl + xx (行の反対側に移動します)
- ctrl + u (カーソルの前のすべてを切り取ります)
- ctrl + k (カーソルの後のすべてを切り取ります)
- ctrl + y (バッファから貼り付けます)
- ctrl + l (小文字のL、画面をクリアします)
より明白なものについては説明しません。ただし、私が見つけた最も便利なショートカットのいくつかは、単語(またはテキストのセクション)を削除して元に戻すことができるショートカットです。 systemd
を使用して一連のサービスを停止しようとしたとします。 、ただし、いくつかの操作が完了した後で、それらのいくつかを開始したいだけです。あなたはこのようなことをするかもしれません:
systemctl stop httpd mariadb nfs smbd
<hit the up button to get the previous command>
<use 'ctrl + w' to remove the unwanted arguments>
しかし、削除しすぎた場合はどうなりますか?問題ありません。ctrl + _
を使用するだけです。 最後の編集を元に戻します。
他のカットコマンドを使用すると、カーソルから行の最後または最初まですべてをすばやく削除できます(Ctrl + k
を使用) およびCtrl + u
、 それぞれ)。これには、切り取ったテキストをターミナルバッファに配置して、後で貼り付けることができるという追加の利点があります(ctrl + y
を使用) )。これらのコマンドをここで示すのは難しいので、自分で試してみることを強くお勧めします。
最後になりましたが、コンテナなどの限られた環境で非常に便利な、めったに使用されないキーの組み合わせについて説明します。以前の出力でコマンドが文字化けしているように見える場合は、解決策があります。ctrl + x + ctrl + e
を押します。 環境変数EDITORで設定されているエディターでコマンドを開きます。これにより、テキストを(潜在的に)折り返すことができるテキストエディタで長いコマンドまたは文字化けしたコマンドを編集できるようになります。通常のファイルで作業する場合と同じように、作業内容を保存して終了すると、エディターを終了するときにコマンドが実行されます。
その他のヒント
Bashシェルに色を表示すると、エクスペリエンスが向上する場合があります。カラー化が有効になっていないセッションを使用している場合、以下は.bash_profile
に配置できる一連のコマンドです。 セッションに色を追加します。これらはかなり単純であり、詳細な説明は必要ありません:
# enable colors
eval "`dircolors -b`"
# force ls to always use color and type indicators
alias ls='ls -hF --color=auto'
# make the dir command work kinda like in windows (long format)
alias dir='ls --color=auto --format=long'
# make grep highlight results using color
export GREP_OPTIONS='--color=auto'
# Add some colour to LESS/MAN pages
export LESS_TERMCAP_mb=$'\E[01;31m'
export LESS_TERMCAP_md=$'\E[01;33m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;42;30m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;36m'
Bash内のさまざまなオプションを調整するだけでなく、時間を節約するためにいくつかの巧妙なトリックを使用することもできます。たとえば、それぞれの終了ステータスに関係なく、2つのコマンドを連続して実行するには、;
を使用します。 以下に示すように、コマンドを分離するには:
[user@centos /tmp]$ du -hsc * ; df -h
これは、現在のディレクトリ内の各ファイルが占めるスペースの量を計算し(そしてそれを合計して)、ブロックデバイスごとのディスク使用量をシステムに照会します。これらのコマンドは、du
によって生成されたエラーに関係なく実行されます コマンド。
最初のコマンドが正常に完了したときにアクションを実行したい場合はどうなりますか? &&
を使用できます 最初のコマンドが正常終了ステータスを返した場合にのみ2番目のコマンドを実行することを示す省略形。たとえば、更新が成功した場合にのみマシンを再起動するとします。
[root@arch ~]$ pacman -Syu --noconfirm && reboot
コマンドを実行するときに、その出力をキャプチャしたい場合があります。ほとんどの人はtee
について知っています コマンド。標準出力を端末とファイルの両方にコピーします。ただし、たとえばstrace
からより複雑な出力をキャプチャする場合 、I/Oリダイレクトの操作を開始する必要があります。 I / Oリダイレクトの詳細はこの短い記事の範囲を超えていますが、私たちの目的のために、STDOUT
に関心があります。 およびSTDERR
。表示されているものを正確にキャプチャする最良の方法は、2つを1つのファイルに結合することです。これを行うには、2>&1
を使用します リダイレクト。
[root@arch ~]$ strace -p 1140 > strace_output.txt 2>&1
これにより、関連するすべての出力がstrace_output.txt
というファイルに配置されます。 後で表示するため。
長時間実行されるコマンドの実行中に、タスクの実行を一時停止する必要がある場合があります。 'stop'ショートカットctrl + z
を使用できます 仕事をやめる(殺さない)。ジョブはジョブキューに追加されますが、再開するまでジョブは表示されなくなります。このジョブは、フォアグラウンドコマンドfg
を使用して、後で再開できます。 。
さらに、ctrl + s
を使用してジョブを一時停止することもできます。 。ジョブとその出力はターミナルのフォアグラウンドに残り、シェルの使用はではありません。 ユーザーに返されます。 ctrl + q
を押すと、ジョブを再開できます。 。
多くの端末が開いているグラフィカル環境で作業している場合は、出力をコピーして貼り付けるためのキーボードショートカットがあると便利な場合があります。これを行うには、次のショートカットを使用します。
# Copies highlighted text
ctrl + shift + c
# Pastes text in buffer
ctrl + shift + v
実行中のコマンドの出力に、別のコマンドが実行されているのが表示され、より多くの情報を取得したいとします。これを行うにはいくつかの方法があります。このコマンドがパスのどこかにある場合は、which
を実行できます。 そのコマンドがディスク上のどこにあるかを調べるコマンド:
[root@arch ~]$ which ls
/usr/bin/ls
この情報を使用して、file
を使用してバイナリを検査できます。 コマンド:
[root@arch ~]$ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB pie executable x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=d4e02b88e596e4f82c6cc62a5bc4ce5827209a49, stripped
あらゆる種類の情報を見ることができますが、ほとんどのユーザーにとって最も重要なのはELF 64-bit LSB
です。 ナンセンス。これは基本的に、スクリプトや他の種類の実行可能ファイルではなく、プリコンパイルされたバイナリであることを意味します。コマンドの検査に使用できる関連ツールは、command
です。 ツール自体。 command -V <command>
を実行するだけです さまざまな種類の情報が表示されます:
[root@arch ~]$ command -V ls
ls is aliased to `ls --color=auto`
[root@arch ~]$ command -V bash
bash is /usr/bin/bash
[root@arch ~]$ command -V shopt
shopt is a shell builtin
最後になりましたが、間違いなく重要なことですが、特にコンテナを操作するときや、知識や制御がほとんどない環境での私のお気に入りのトリックの1つは、echo
です。 指図。このコマンドを使用して、for
を確認するためのチェックからすべてを行うことができます。 loopは期待されるシーケンスを実行して、リモートポートが開いているかどうかを確認できるようにします。構文は、開いているポートを確認するのが非常に簡単です。echo > /dev/<udp or tcp>/<server ip>/<port>
。例:
user@ubuntu-1604:~$ echo > /dev/tcp/192.168.99.99/222
-bash: connect: Connection refused
-bash: /dev/tcp/192.168.99.99/222: Connection refused
user@ubuntu-1604:~$ echo > /dev/tcp/192.168.99.99/22
ポートが接続しようとしているタイプの接続に対して閉じられている場合、Connection refused
が表示されます。 メッセージ。パケットが正常に送信されると、出力はありません。
これらのヒントによって、Bashがより効率的で楽しく使用できるようになることを願っています。ここにリストしたよりも多くのトリックがBashに隠されています。お気に入りは何ですか?
付録1.対象となるヒントとコツのリスト
# History related>
ctrl + r (reverse search)
!! (rerun last command)
!* (reuse arguments from previous command)
!$ (use last argument of last command)
shopt -s histappend (allow multiple terminals to write to the history file)
history | awk 'BEGIN {FS="[ \t]+|\\|"} {print $3}' | sort | uniq -c | sort -nr | head (list the most used history commands)
# File and navigation
cp /home/foo/realllylongname.cpp{,-old}
cd -
rename 's/text_to_find/been_renamed/' *.txt
export CDPATH='/var/log:~' (variable is used with the cd built-in.)
# Colourize bash
# enable colors
eval "`dircolors -b`"
# force ls to always use color and type indicators
alias ls='ls -hF --color=auto'
# make the dir command work kinda like in windows (long format)
alias dir='ls --color=auto --format=long'
# make grep highlight results using color
export GREP_OPTIONS='--color=auto'
export LESS_TERMCAP_mb=$'\E[01;31m'
export LESS_TERMCAP_md=$'\E[01;33m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m' # end the info box
export LESS_TERMCAP_so=$'\E[01;42;30m' # begin the info box
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;36m'
# Bash shortcuts
shopt -s cdspell (corrects typoos)
ctrl + _ (undo)
ctrl + arrow (move forward a word)
ctrl + a (move cursor to start)
ctrl + e (move cursor to end)
ctrl + k (cuts everything after the cursor)
ctrl + l (clears screen)
ctrl + q (resume command that is in the foreground)
ctrl + s (pause a long running command in the foreground)
ctrl + t (swap two characters)
ctrl + u (cuts everything before the cursor)
ctrl + x + ctrl + e (opens the command string in an editor so that you can edit it before it runs)
ctrl + x + * (expand glob/star)
ctrl + xx (move to the opposite end of the line)
ctrl + y (pastes from the buffer)
ctrl + shift + c/v (copy/paste into terminal)
# Running commands in sequence
&& (run second command if the first is successful)
; (run second command regardless of success of first one)
# Redirecting I/O
2>&1 (redirect stdout and stderr to a file)
# check for open ports
echo > /dev/tcp/<server ip>/<port>
`` (use back ticks to shell out)
# Examine executable
which <command>
file <path/to/file>
command -V <some command binary> (tells you whether <some binary> is a built-in, binary or alias)