ブログパーツ アクセスランキング
インフラ情報まとめ
アクセスランキング
サーバー、クライアント関係の構築、運用等のまとめ書きです。旧名 ほぷぅ(。・ω・)ノPCまとめ

スポンサーサイト




にほんブログ村 IT技術ブログ IT技術メモへ
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。








  1. --/--/--(--) --:--:--|
  2. スポンサー広告

シェル リダイレクションの使用に関する注意




にほんブログ村 IT技術ブログ IT技術メモへ

シェル リダイレクションの使用に関する注意


コマンドにリダイレクションを使用する場合、それぞれのコマンドごとに指定しなければなりません。
あるコマンドに対するリダイレクトは他のコマンドには影響を与えません。


command1 2>ErrorFile1 | command2 2>ErrorFile2


command1のエラーを書くファイルと、command2のエラーを書くファイルは別物であり、
コマンドごとにリダイレクトしなければいけません。


注意
標準入力と標準出力を同じファイルにリダイレクトしてはいけません。
同時に指定すると読み込むファイルが不当にものになります。


echo "foo" > file
sed 's/foo/bar/' < file > file #入力と出力が同じファイルではいけない
cat file


この例では、fileというファイルにfooというデータを書き込みます。
このファイルのfooという文字列をsedコマンドでbarという文字列に変え、そのまま同じfileに書き込もうとしています。


結果はfileの中にはなにも残りません。fileからデータを読み込む前に、出力ファイルにfileを指定したため、中身をクリアしてしまったからです。


パイプを使った使用例

DEVICE=lp1
# DEVICE=lp2
# DEVICE=lp3
pr $* |
case $DEVICE in
lp1) rsh host1 lp -dlp1 ;;
lp2) rsh host2 lp -dlp2 ;;
lp3) rsh host3 lp -dlp3 ;;
esac

この例は、ネットワーク上のプリンタのどれかを使ってファイルをプリントするためのシェルスクリプトの一部抜粋例みたいなイメージのものです。どのプリンタが使用可能かによって書き換えるようにします。


ここではデフォルトでは lp1を使用していますが、コメントの行を変えることによりlp2やlp3に割り当てを変えることもできます。


コマンド行に入力されたもの($*)を受け取ってprコマンドで処理し、結果を標準出力に出します。
これはパイプによってcase文の中で実行されるコマンドの標準入力でもあるのです。

変数DEVICEの値によってこの3つのパターンのうちどれかが実行されます。
ここでは直接リダイレクション記号を使って処理させているわけではありませんが、こういう考え方で処理させます。


次のようなwhile文のネストもあります。

while read FILENAME
do
while read LINE
do
..........
done < $FILENAME
done < file


外側のwhileループはfileから1行ずつ読み込んで処理します。内側のループは、
その読み込んだ行をまたさらに処理します。

標準入力をファイルから読み込ませているとき、実際の端末から何らかの入力をさせたい場合には、
その使っている端末を意味する /dev/tty ファイルをリダイレクトさせます。


ttyというコマンドは、現在使用している端末を教えてくれるので、この結果使って
直接端末からの入力をリダイレクトさせることができます。

TTY='tty' #TTYには /dev/ttyp3といった「今使っている端末デバイス」が入る


while read FILENAME
do
echo "Do you want to purge $FILENAME ?"
read ANSWER < $TTY
.....
done < file


こうすることによって、標準入力をファイルから利用している場合でも、端末からのデータ入力が可能となります。






スポンサーサイト



テーマ:UNIX/Linux - ジャンル:コンピュータ


  1. 2012/12/13(木) 19:30:31|
  2. Linux/Unix シェル
  3. | トラックバック:0

ヒア・ドキュメント Here Documents 2




にほんブログ村 IT技術ブログ IT技術メモへ

シェル ヒア・ドキュメント Here Documents 2


LinuxのシェルではTABは補間機能になっているのでうまくいきませんがこういう事例もあります。

$ cat <<- END
> <TAB>This is a
> <space><space>here $DOC.
> END
This is a
here document.

<<のあとにハイフン(-)をつけるとヒア・ドキュメントの部分の行頭のタブ(スペースではありません)は入力されていないものとして処理されます。

入力はヒア・ドキュメントから読み取り、標準出力やエラー出力をファイルにリダイレクトするには
以下のようにします。


command << EOF > stdout 2>stderr
..................
EOF


パイプに渡すことも可能です。

command << EOF | command2
..................
EOF

ヒア・ドキュメントは、キーボードや他のファイルからの入力を必要としません。
シェルプログラムの中であるコマンドに対してきまった操作を行わせることができます。
エディタコマンドに対する入力もできてしまいます。
edコマンドを使っての例です

edコマンドは、-オプションを指定すると画面にメッセージを出力しません。
シェルプログラムの中で実行するため、余計なメッセージは出さないようオプションをつけて起動します。

次の例では読み込んだファイルをさかさまに並べてみます。

ed - file <<- !
g/^/m0
w
1
!

edでfileというファイルをオープンします。
次の!の行までがヒア・ドキュメントの部分です。
キーボードから行う入力と同じことを書き込みます。
<<のあとには任意の文字を書けますので前回ではEOFとしていました。ここでは!にしています。

g/^/m0

の意味は、最初のgでこのファイルの中で一致するパターンを探します。
何に一致するものを探すかという指定が、この直後に続く /で囲まれた文字列です。
そこには ^ があります。これは行頭を表します。


よってファイルの中の全部の行に対して処理をすることになります。
次にm0は0行目に移動しないさいという意味です。
そのファイルの先頭に移動させることを意味します。

すべての行に一致するので最初は一行目です。この行をファイルの最初に移動させます。
次に2行目です。これをまたファイルの最初にもっていきます。これを順にファイルの最後までを繰り返していけば行が全部さかさまになります。

最終行が最初の行に移動した時点で、このコマンドは終わります。
次のwコマンドで上書き保存します。
さらに、qコマンドでedコマンドを終了します。
!ヒア・ドキュメントが終了します。


実例です。testdocを用意します。中身はこのようになっています。
[root@localhost sh]# cat testdoc
1-Line
2-Line
3-Line
4-LIne

実行します。
[root@localhost sh]# ed - testdoc <<- !
> g/^/m0
> w
> 1
> !
4-LIne

逆に並べ替えられました。
[root@localhost sh]# cat testdoc
4-LIne
3-Line
2-Line
1-Line


プログラムの中で画面に表示する必要はないのでviよりexを選択することになります。
viのビジュアル機能を削ったのがexになります。


シェルスクリプトの中でedやexといったエディタを起動し、ファイルを編集できるのは非常に有用です。
ヒア・ドキュメントの利用の真骨頂です。正規表現を駆使して操作の幅を広げることが可能です。









テーマ:UNIX/Linux - ジャンル:コンピュータ


  1. 2012/12/11(火) 19:30:30|
  2. Linux/Unix シェル
  3. | トラックバック:0

シェル ヒア・ドキュメント Here Documents 1




にほんブログ村 IT技術ブログ IT技術メモへ

シェル ヒア・ドキュメント Here Documents 1


あるコマンドに渡すキーボードからの入力文字列を、そのコマンドの直後に指定することができます。

標準入力用のファイルを用意し、リダイレクト機能でそのファイルから読み込ませるという方法では、ファイルを別個に用意しなくてはなりませんし、リダイレクトの書き方を誤って(スペースのありなしや&の書き忘れ)しまうこともあります。


1つのシェルスクリプトの中に、入力する文字も同時に書いてしまえればファイルは1つですみますし、リダイレクトを番号で操作したりするよりわかりやすくなります。

そういう書き方をヒア・ドキュメントといいます。


書き方例
<<word


wordという部分にはどのような言葉(文字)を使ってもかまいません
この場合、このあとwordという言葉が「行頭に、しかもその一語だけの行として出てくるまでの間に書かれたテキストがすべての標準入力からのものとして処理されます。

「ここまでの入力のデータとして扱う」の意味をできるだけ明示的にするためにwordの部分にはEOFやENDという言葉が使われます

command << END
・・・・・・・・
・・・・・・・・
END

こうかくと、・・・・・の部分が command の入力として扱われます。


cat コマンドについて考察します。引数にファイル名が指定されていればそのまま画面に
出力します(標準出力)。catコマンドに引数が何もない場合には、標準入力から入力を読み取り、
キーボードから ^D(Ctrl+D)が入力されるまで入力されたものをそのまま表示します

[root@localhost sh]# cat ←引数なし
This is a ←入力
This is a ←そのまま表示された
input data. ←入力
input data. ←そのまま表示された この直後 CTRL+Dキー入力で戻る
[root@localhost sh]#


これを、<<を使用してみます。
[root@localhost sh]# cat << END
> This is a
> hire document.
> END
This is a
hire document.

<<のあとに指定した文字列が現れるまでが、コマンドの入力として扱えます。


ここで、入力データの中に、$が入っていると・・・
[root@localhost sh]# cat << END
> This is a
> here $DOC.
> END
This is a
here .

$DOCという変数として処理してしまいます。$DOCにはなにも設定されていませんので空白つぎの.(ピリオド)だけがむなしく表示されます。


次のように変数に値をセットしておけば、その値に変換されて出力されます。
[root@localhost sh]# DOC=document
[root@localhost sh]# cat << END
> This is a
> here $DOC.
> END
This is a
here document.


次のようにバックスラッシュで(\)「ろ」のキーでクォートすれば変数にならずに処理できます。
[root@localhost sh]# DOC=document
[root@localhost sh]# cat << \END
> This is a
> here $DOC.
> END
This is a
here $DOC.

もちろんその変数だけをクォートしてもかまいませんが全体をクォートしてしまう前者のほうがおすすめです。


シングルクォーテーションで囲っても同じ効果があります。
[root@localhost sh]# DOC=document
[root@localhost sh]# cat << 'END'
> This is a
> here $DOC.
> END
This is a
here $DOC.










テーマ:UNIX/Linux - ジャンル:コンピュータ


  1. 2012/12/10(月) 19:30:34|
  2. Linux/Unix シェル
  3. | トラックバック:0
次のページ


サイトマップ・お奨め記事

CentOS7 まとめ
Ubuntu14 まとめ
Ubuntu12用無線アダプタ紹介
Ubuntu12 まとめ
Server 2008R2 まとめ
SCCM2012R2 まとめ
Windows10 アップグレード
Windows7 まとめ
Windows7 SSD まとめ
Windows8 まとめ
EaseUS Todo Backup Server
Linux Destbision まとめ
Linuxコマンド関連Index
Zorin8.1まとめ
Fedora17まとめ
Fedora15まとめ
VB Script まとめ
USB3.0で快適バックアップ
リンク集・メール


スポンサードリンク


リンク


サイト登録Paseon

・はじめての自宅サーバ構築 - Fedora/CentOS -

・Fedoraで自宅サーバー構築

・CentOSで自宅サーバー構築

・ぼくんちのTV別館

・ネットセキュリティブログ

・まとめ横丁

・オールフリーソフト


相互リンク更新情報
BookMark
GPUベンチマーク(ドスパラ)
VMware OS仮想化
EaseUS
Fedora releases ISO
【Http外部からの表示確認】
ポートスキャンチェック
IPA情報処理推進機構
無料DNS ieServer
無料DNS-MyDNS
yahooログイン履歴チェック
メール不正中継拒否テスト
Fedora Project
allbootdisks
Edy Viewer
ESXi動作実績ハードウェア@Wiki
IEEE Standards

---ライセンス認証解除系リンク---
ShadowProtect Personal
.NET製品
弥生



--所有サーバーWiki--
NEC Express5800/S70
HP ProLiant ML110G5
PRIMERGY TX100 S3

このブログをリンクに追加する

カテゴリ

Linux (45)
Linux-CentOS7 (70)
Linux-Ubuntu14.04 (87)
Linux-Ubuntu12.04 (76)
Linux-Zorin8.1 (36)
Linux-Fedoras.soft (19)
Linux-Fedora18 (11)
Linux-Fedora17 (39)
Linux-Fedora15 (60)
Linux-Fedora11 (36)
Linux-Fedora16 (1)
Linux-Security (3)
Linux/Unix シェル (38)
Linux Distribution (53)
仮想OS (31)
Windows Server 2008 (254)
Windows Server 2012 (30)
Windows Server コマンド (39)
Windows Server アプリ (14)
Windows (40)
Windows 10 (3)
Windows 7 (59)
Windows 8 (257)
Windowsアプリ (23)
Windows 8 アプリ (29)
Windows レジストリ (6)
Windows BAT (17)
ネットワーク (5)
MySQL (1)
ニュース (8)
ハードウェア (11)
Windows VBScript-Basp21 (1)
VBScript (29)
Windows Vista (1)
Windows グループポリシー (3)
Security (6)
未分類 (4)
クールなアイテムまとめ (5)
Game (1)
PowerShell (4)


Linux ブログランキングへ

カテゴリ2

SCCM Backup 遠隔操作 VirtualBox FeliCaポート/パソリ ESXi 

カウンター

RSSリンクの表示

アクセスランキング

[ジャンルランキング]
コンピュータ
50位
アクセスランキングを見る>>

[サブジャンルランキング]
その他
13位
アクセスランキングを見る>>



フィードメーター - ほぷぅ(。・ω・) ノ PCまとめ Linux,Win,自宅サ..


Windows ブログランキングへ

にほんブログ村 IT技術ブログ IT技術メモへ
にほんブログ村

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

 



Linux ブログランキングへ





<%plugin_third_title>

<%plugin_third_description>

<%plugin_third_content>

<%plugin_third_description2>

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。