Linuxでコマンドの実行方法を制御!
Linuxはユーザーのコマンド入力でコンピュータを制御します。
LinuxOSとユーザーの入力をつなげるパイプに当たるプログラムが「シェル」です。
代表的なシェルは「Bash」です。
コマンド基本的には1行、1コマンドずつ実行しますが、複数同時に実行したり、一つずつ連続で実行することも可能です。
コマンドを連続して実行「;」
複数のコマンドを連続して実行したい場合があります。
一つずつ入力してEnterを押すよりも早かったり、結果が見やすかったりします。
連続実行するには「;」でコマンド同士を連結します。
実際に「pwd;ls;cd ~」を実行したのが下の画像です。
3つのコマンドが連続して実行しているのがわかります。
正常に実行された時のみ実行「&&」
コマンドを「;」で挟んだ場合は前のコマンドから順番に実行しますが、前部のコマンドがエラーで実行できなくてもすべてのコマンドが実行されます。
「&&」で挟んだ場合は前のコマンドが正常に実行されたときのみに後のコマンドが実行されます。&&は論理積「AND」の意味と同じです。
cd /etc/test && mkdir /etc/test/example
/etc/testのディレクトリに移動できた場合のみ/etc/test/exampleのディレクトリを作成するコマンド
エラーが出たときのみ実行「||」
&&とは違って前部のコマンドがエラーで実行できなかった時だけ後のコマンドを実行するコマンドです。
cd /etc/test || mkdir /etc/test
コマンドの先頭の「$」は一般ユーザーを表す
bashのコマンドラインの先頭に「$」のマークがあることがあります。これはユーザーの権限を表していて一般ユーザーを表しています。
root権限とは違って書き込みできるディレクトリが制限されたり、実行できないコマンドなどがあったりします。
たとえば「yum install ~」コマンドは一般ユーザーでは実行できません。
コマンドの先頭の「#」は管理者 rootユーザーを表す
Bashのコマンドラインの行頭にある「#」は管理者ユーザーを表しています。rootユーザーは一般ユーザーとは異なり、制限なくどんな操作も可能です。一般ユーザーからrootユーザーに変更するにはsuコマンドを使います。
バックグラウンド実行する「&」
「&」一文字は直感的な意味とは違います。「&」をコマンドの後に付けるとバックグラウンド実行します。バックグラウンド実行はプロセスは動きますが、画面には結果はでてきません。
# jobs & pstree &
と実行すると実行プロセスIDが表示されるだけで、jobsやpstreeの結果は表示されません。&はコマンドを挟むのではなく、コマンドの後につけます。
ちなみに「fg」と入力して実行すると最後にバックグラウンド実行したプロセスがフォアグラウンド実行されます。
リダイレクション
リダイレクションとはコマンドの入出力をコントロールする方法です。
- パイプ「|」 パイプでコマンドを挟むと前のコマンドの出力を後のコマンドに入力することを意味します。よく使うのはls | grep etc
- 「>」出力結果をファイルに上書き保存
- 「>>」出力結果をファイルに追加保存
- 「<」ファイルの内容を前のコマンドの入力とする cat < test.txt
- 「<<」ヒアドキュメント
パイプ「|」
パイプに挟んだコマンドの出力を次のコマンドに渡す役割があります。パイプは非常によく使います。
コマンドを打つと普通は実行結果がそのまま画面に出力されますがパイプを打つと次のコマンドの入力にします。実際に実行結果をみましょう。
file2.txtのファイルをcatファイルで出力してみます。
# cat file2.txt
ta na ka
sakana
sapana
oden
この出力結果から「sa」を含む行を抽出します。条件にマッチする行を抽出するコマンドgrep saに入力を渡すためにパイプを使います。
# cat file2.txt | grep sa
sakana
sapana
このようにgrep saコマンドにcat file2.txtの出力を渡す役割がパイプにはあります。