• 締切済み

ヒアドキュメントの動作

Unix系でヒアドキュメントを利用する場合について教えて下さい。 ヒアドキュメント(一般的にはEOFで囲む?)を利用すると、複数行に渡ったデータをコマンドに対して送る事が出来ると思います。しかし、suコマンドにヒアドキュメントを使う事は出来ません。 ヒアドキュメントをコマンドに対して指定した場合、内部的(プロセスの生成、ファイルディスクリプタの生成、ヒアドキュメントデータの受け渡し、解析等)にはどのような動作になりますでしょうか。また、何故suコマンドの場合はヒアドキュメントが有効でないのでしょうか(現在はexpectを利用しています) ヒアドキュメント内の一行一行がどのようなタイミングで解釈され実行されるのか、ご存知かどこかに資料があれば教えていただきたく思います。

みんなの回答

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.2

ヒアドキュメントの中身は、コマンド実行の前に、ひとかたまりのファイルとして作成され、それがコマンドの標準入力に繋がります。 command <<EOF a b c EOF は、 echo "a b c" > tmpfile command < tmpfile とほぼ同じです。 su とか passwd コマンドは、パスワードを標準入力からでなく、端末から入力するので、自動化にはexpectなど疑似端末を扱えるソフトが必要です。 標準入力はデフォルトでは端末ですが、リダイレクトできるので端末とイコールではありません。端末はリダイレクトできません。

tondemosan
質問者

お礼

passwdコマンドでも、バージョンにより標準入力に対応していたりしますね シェルから起動して、リモートにSSHでログインして、そこから更にsuを打つ、と言った場合、プロセスの移動を追うのは中々大変そうですね(^^; 仰る通りexpectのような受け取った出力によって操作を変えるプログラムが 必要になりそうですね・・・。 有難うございました

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

suでパスワードを入れたいということでしょうか? 一般にヒアドキュメントは標準入出力をまとめるときにつかいます。 実行コマンドが標準入力に対応していなければ意味がないでしょう。

tondemosan
質問者

お礼

素早いご回答有難う御座います。 suでパスワードを入れたいと言うよりは、どう言う理由で出来ないのか裏側の原理を把握したく思いました。 ヒアドキュメント内部のデータをどう解釈して処理するかは行き先のプロセス次第と言う事ですか。(例えば改行コードをコマンドの区切りとみなすかなど) ヒアドキュメント自体の動作は、あくまで文字列をシェルに解釈させずそのままの状態で渡すための物という事でしょうか?改行時にバックスラッシュを打つ場合との使い分けが良く分からなくなってきました。。。

関連するQ&A

  • DOSのバッチファイルでのヒアドキュメント

    UNIXのシェルスクリプトでは、コマンドに引数を渡すときに ヒアドキュメントを使って 例えば、 command <<EOF data ・ ・ ・ EOF という風に、commandの次行からEOFという文字が出てくるまでの間の 値を引数として与えられたり出来ますが DOSのバッチファイルでも同じ様なこと(似たようなこと)は出来るのでしょうか 現在とあるコマンドに対し、データセットを渡す際に その都度データファイルを作って、リダイレクトで引数を渡す という方法で、対処しています これが出来ると、小さなデータセットくらいならファイル作らなくて済むので (バッチファイル中にデータセット書き込めるので) ファイル管理とか非常にやりやすくなるんですが・・・ ご存じの方、教えて下さい!! 勿論、代替策でも結構です

  • unix コマンドの返り値を一行にする方法について

    unix コマンドの返り値を一行にする方法について lsコマンドをリダイレクトでファイルにすると file1 file2 file3 と3行になります。 これを file1 file2 file3 の一行にしたいのですが、方法はありますか。 尚、ファイルの数は3個とは限りません。 わかる方がいらっしゃれば、教えてください。 よろしくお願いいたします。

  • ファイルから特定の行を出力したい

    あるファイルの特定の一行だけを取りだすunixの コマンドを教えて下さい。 具体的には cat a.txt 1gyoume 3gyoume 4gyoume 5gyoume 6gyoume 7gyoume 8gyoume といったファイルの末尾からX行目の内容を変数に入れたいのです。 a.txtが8行あると判断して8-X行目でファイルを分割、そのファイル をtailコマンドで末尾1行目だけ出力すると出来そうだと思ってい るのですがもっと簡単な方法はないでしょうか。

  • 終端識別子 とは?

     以下PHP参考書の ヒアドキュメント の説明すが、その中に、「終端識別子」とあります。  「終端識別子」とは何のことなのでしょうか!?    もし、以下の説明の中に「終端識別子」があるのでしたら、何にあとるのですか!?   私は読解力にかけるので分かりません!?   宜しくお願いいたします。   P61 ヒアドキュメント    PHPでは複数行又がる長い文字列を手軽に利用する方法として、シングルクオートとダブル クオートのほかにヒアドキュメントという方法があります。ヒアドキュメントはヒアドキュメント 構文(<<<)のあとに終端識別子を定義し、その終端識別子が出現するまでを文字列とします。  終端識別子は必ず行頭から始まり、直前に空白(インデント)を含めず、すぐに改行する必要が あります。また、ヒアドキュメントの中では、ダブルクオートと同様に変数が展開されます。また、ダ ブルクオートはそのままダブルクオートになります。 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  <?php $age = 15; $foo = <<<EOI ヒアドキュメントでは、このように、 複数行にわたる文章をそのまま表記することができます。 Tom の年齢は "$age" 歳です。 EOI; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ もちろん、ダブルクオートで通常の文字列を定義するように、複数行にまたがる文字列を定義す ることもできます。しかし、文章の中にダブルクオートが含まれる長い文章などでは、いちいちダブル クオートにエスケープ(\")が必要となり、これで不便な場合があります。ヒアドキュメントは、た とえばHTMLのテンプレートを記述したり、コマンドラインのヘルプ文を作成するなどに役立ち ます。

    • ベストアンサー
    • PHP
  • Windowsでsuコマンド

    ユーザのパスワードを知ることなくユーザの環境をセットアップ できないかなと考えています。 Unixでは 管理者はsuコマンドを使いユーザのパスワードを知らなくても ログインしてユーザの環境を利用することができます。 似たような機能として runasコマンドや 別のユーザとして実行 という 機能があるのですがパスワードが必要だし、ユーザの環境をセットアップ したい時には意味がありません。 どなたか知っていたら教えてください。 よろしくお願いします。

  • エクセルVBAのprintステートメントについて

    エクセルVBAのprintステートメントについて エクセルVBAからテキストファイルに文字列を書き出す場合、output権限でテキストファイルを開いて、printで一行ずつ書き出すということをやっています。この際、テキストファイルの最終行の次の行に一行を書き出すのではなく、最終行の最後に追記することはできますでしょうか。 例えば、下記のようなテキストファイルの場合、cccの次の行に書き出すのではなく、 cccの直後に文字列を書きたいのです。 よろしくお願いします。 ファイルの始まり aaa bbb ccc <EOF> -- エクセル2003

  • expectの使い方について

    expectの使い方についてご教示頂きたいことがあります。 内容は以下の通りです。 1)スイッチ機器にtelnetし、自動的に設定を行うようにしたい。 この機器の通常のプロンプトは"goo#"とする "goo"はあらかじめ変数"host"として代入される。 telnet後、この装置のプロンプトが本当に goo#だったら"save"コマンドを実行する。 expect "${host}#" send "save\n" ここまではわかるのですが、ではgoo# 以外のプロンプトだったら即座に処理を中断 (別の処理)したいのです。 2)ログイン中に別ファイルを呼び出し、その中から1行ずつ抜き出して改行コードつきでコマンドを実行したい場合どうすればいいのか http://www.linux.or.jp/JM/html/expect/man1/expect.1.html このページは読んだのですが、いまいちよく理解できません。 よろしくお願いいたします。

  • IEのメニューバー・ツールバー・アドレスバーを一行に・・

    IEを全画面表示(F11)にして利用してます。 この間まではタイトルの通り、 メニューバー・ツールバー・アドレスバーは一行に 収まっていました。 ・・・が、気がついたらツールバーのみが表示されて いたので、メニューバーとアドレスバーを表示したら 各々一行づつ表示されてしまい、計3行になりました。 ドラッグで移動するかな?と思ったのですが、全然動かず・・(笑)。 全画面表示じゃない場合は移動出来て、一行にする事は 可能でした。 どうすれば元通り、一行に全てのバーを収める事が 出来るのでしょうか? どうぞ教えて下さいませ・・・m(__)m

  • シェルの中からシェルを呼び出して判定

    UNIXで以下のようなシェルが動作しております。 #!/bin/sh su abcdef -c './GHI'; err=$? if [! $err -eq 0 ] then echo エラーが発生しました fi exit このシェルは「abcdef」ユーザに移ってカレントディレクトリのシェルコマンド「GHI」の結果を判定するというものです。 UNIX上では問題なく動作しております。 これをLinuxでそのまま動作させると「err」に「su abcdef」というユーザ切替コマンド自身の正否を格納しているようです。 「'」でくくられた範囲内で結果をファイルに格納したりして、その後ファイルの中を見て判断するとうまくいくことは分かっておりますが、出来たらファイルなど使いたくありません。 このような場合、みなさんどうしてるんでしょうか? よく出てくるパタンだと思うのですがどうしても良い対処が見つかりません。 どうか宜しくお願いします。 Linuxは「miracle-Linux2.0」というOSです、いわゆるRedHat系です。

  • 多数あるファイル(text base)の*行目だけを引っ張ってきて標準出力させたい。

    Unix初心者です。 SunOS > head -1 ./*.txt とすれば、以下のように1行目だけを引っ張ってきて標準出力させる事も可能ですが。 ==> 1234.txt <== hello ==> 1235.txt <== hello SunOS > head -2 ./*.txt とすると、1行目と2行目が標準出力されます。 ==> 1234.txt <== hello bye ==> 1235.txt <== hello bye ですが、以下に例をあげますが、このように " 2行目だけ " を標準出力させたいのです。 ==> 1234.txt <== bye ==> 1235.txt <== bye sed -n '2p' ./*.txt だと、理由は不明ですが一つのファイルしか標準出力されませんでした。 head 、sed でなくともawk grepでも構いません。 その他の自分の知らないコマンドで構いません。 文字検索ではなく、*行目と行数指定です。 できれば、ファイル名も同時に出力させたいのです。 欲を言えば、行数も出力させたいです。 更に、翌を言えば、指定行を増やせたら最高です。 例;)1行目と3行目を標準出力する。 scriptを作りこまずに、|(パイプ)でつなげれば一行のコマンドで処理可能なのでは ないかと想像してますが、いかがでしょうか。 宜しく頼みます。