複数コマンドの組合せ
- 2015/08/27
- 10:52
今まではコマンドを1行ずつ実行してきました。
実は!シェルは複数のコマンドを連続して実行することが可能です。
今回はそんな1行で複数のコマンドを実行する方法の紹介です。
「| (バーティカルバー)」を使った書式
パイプ処理といいます。
コマンド1の出力をコマンド2の入力として実行します。
$ ls /etc | grep release

「ls」コマンドで「/etc」ディレクトリを表示させ、その出力結果から
「release」を含むものだけを表示するという処理になります。
「ls」コマンドと「grep」コマンドの合わせ技です(`・ω・´)ノ
ちなみにさらに「 | 」を使って組み合わせてもOKです!!
$ ls /etc | grep release | grep centos

「/etc」ディレクトリの中にあるもので「release」がついているものを
抽出し、抽出したものの中から「centos」がつくものを表示ということに
なります。
「; (セミコロン)」を使った書式
コマンド1を実行したあとにコマンド2を実行します。
パイプ(「|」)処理と違いコマンド1の結果をコマンド2に渡すなどはしません。
コマンドが羅列されているだけのイメージです。
$ date ; ls /etc/centos-release
2015年 8月 26日 水曜日 17:29:33 JST
/etc/centos-release
「date」コマンドと「ls」コマンドがそれぞれ実行され、結果もそれぞれ
表示されます。
こちらもいくつでも複数コマンドを組み合わせてOKとなります。
$ date ; pwd ; ls -l ; ls -l /etc/centos-release ; cp -p /etc/centos-release BAK_centos-release ; ls -l
※画面の都合上、改行して表示されることがありますが1行です。

上記のコマンドは6つのコマンドからなっています。
あまり意味を深く考えてはいけない羅列ではありますが・・・(^^;
①date
・・・・・・・・・・・作業日の取得
②pwd
・・・・・・・・・・・カレントディレクトリの確認
③ls -l
・・・・・・・・・・・カレントディレクトリの中身の確認
④ls -l /etc/centos-release
・・・・・・・・・・・「/etc」ディレクトリに対象のファイルがあることを確認
⑤cp -p /etc/centos-release BAK_centos-release
・・・・・・・・・・・「/etc」ディレクトリにある「centos-release」ファイルを
カレントディレクトリにコピーする
※処理成功時の結果出力はありません。
⑥ls -l
・・・・・・・・・・・コピー後のカレントディレクトリの中身の確認
「BAK_centos-release」というファイルが表示されていることが
⑤の「cp」コマンドの成功ということになります。
1つずつコマンドを実行できます。
あえてつなげて処理しています。
コピー元のファイルがなかった場合はどうなるのでしょうか?
$ date ; pwd ; ls -l ; ls -l /etc/centos ; cp -p /etc/centos BAK_centos-release ; ls -l
※画面の都合上、改行して表示されることがありますが1行です。
※「centos-release」ファイルを存在しない「centos」で実行しています。

先ほどと違うところをチェック!チェックφ(@゜▽゜@)
③ls -l
・・・・・・・・・・・先ほどコピーしたファイルが出てきます。
④ls -l /etc/centos-release
・・・・・・・・・・・「/etc」ディレクトリに対象のファイルがないとエラーが出力されています。
⑤cp -p /etc/centos-release BAK_centos-release
・・・・・・・・・・・「/etc」ディレクトリに対象のファイルがないがかまわずコピーコマンドを
実行しています。コピー元がないのでもちろんエラーで終了します。
先ほどとは違いエラーがあったことは出力されます。
着目してほしいのは④と⑤の結果です。
④でコピー元のファイルがないことを確認しています。
しかし気にせず⑤でコピーを実行しました。
独立したコマンドを1行に書いているだけって感じです。
「&& (アンパサンド)」を使った書式
コマンド1が正常終了ならコマンド2を実行します。
条件判断が入ってきます。
先ほど作成した「BAK_centos-release」というファイルがカレントディレクトリ内に
存在することを念のため確認しておきます。
$ ls -l BAK_centos-release
合計 4
-rw-r--r--. 1 testuser testuser 38 4月 1 07:27 BAK_centos-release
先ほど作成したばかりなのでまぁありますよね(^^;
では対象のファイルがあることが前提で「&&」を使ったコマンドを実行します。
$ ls -l BAK_centos-release && rm BAK_centos-release
-rw-r--r--. 1 testuser testuser 38 4月 1 07:27 BAK_centos-release
コマンド1である「ls」コマンドを実行し「BAK_centos-release」ファイルの
存在の確認をします。もちろん存在するので、結果は正常終了ということになります。
ファイルが存在した場合は、コマンド2が実行されます。
「rm」コマンドで「BAK_centos-release」ファイルを削除するという処理を実行します。
※「rm」コマンドはファイルの削除コマンドです。
ファイルがあることは先ほど確認しましたので必ず実行されるはずですw
では対象のファイルが削除されているか確認しましょう!!
$ ls -l BAK_centos-release
ls: BAK_centos-release にアクセスできません: そのようなファイルやディレクトリはありません
なくなりましたね!
全コマンド正常終了です わぁーいヾ(´∇`。*)ノ
では逆に、ファイルがない状態で先ほどのコマンドを実行するとどうなるのでしょう?
先ほどファイルが存在しないことは確認してますよね!
$ ls -l BAK_centos-release && rm BAK_centos-release
ls: BAK_centos-release にアクセスできません: そのようなファイルやディレクトリはありません
「ls」コマンドの時点で怒られた!!
まぁ念のため「ls」コマンドでファイルの確認もしようっか!
$ ls -l BAK_centos-release
ls: BAK_centos-release にアクセスできません: そのようなファイルやディレクトリはありません
う~ん・・・存在しないファイルに対して削除しようとしてもエラーだよねw
しかもコマンドが実行されているかどうかもわからないwww
じゃ!ファイル作るコマンドに変えてやってみよう!
ファイルを作成するコマンドに「touch」コマンドというのがありますのでそれにしてみます。
$ ls -l BAK_centos-release && touch BAK_centos-release
ls: BAK_centos-release にアクセスできません: そのようなファイルやディレクトリはありません
1つ目のコマンドはエラー(異常終了)でした。
2つ目のコマンドが実行されているかは再度「ls」コマンドで確認です。
$ ls -l BAK_centos-release
ls: BAK_centos-release にアクセスできません: そのようなファイルやディレクトリはありません
はい!
結果は変わりませんでしたwww
1つ目のコマンドである「ls」コマンドがエラー(異常終了)なので、
2つ目のコマンドは実行されないのです。
「|| (バーティカルバー2本)」を使った書式
コマンド1がエラー(異常終了)だった場合コマンド2を実行します。
先ほどとは逆のタイプです。
先ほど処理が実行されなかったこちらのコマンド・・・
$ ls -l BAK_centos-release && touch BAK_centos-release
こちらの「&&」部分を「||」に変更して実行します。
※「BAK_centos-release」ファイルが存在しないことが前提です。
$ ls -l BAK_centos-release || touch BAK_centos-release
ls: BAK_centos-release にアクセスできません: そのようなファイルやディレクトリはありません
1つ目のコマンド「ls」でファイルが存在しないというエラー(異常終了)が出ました。
なので「touch」コマンドが実行され「BAK_centos-release」という名前のファイルがが
作成されているはずです。
確認してみましょう~
$ ls -l BAK_centos-release
-rw-rw-r--. 1 testuser testuser 0 8月 27 10:31 BAK_centos-release
あった(*゚Д゚*)ノ
コマンド2つ目が実行されたことになります。
スポンサーサイト