• 締切済み

cshの標準出力を制御したい

実は以下にも同じ質問があったのですが、回答がついてなかったので改めて質問させて頂きます。 cshで以下の様な形で"ls"の結果をシェル変数に取りたいのですが: set list = `ls *.s | sed -n 's/\.s//p'` lsの結果がマッチしなかったときに出力されるメッセージ: ls: 照合パターンに合いません. がコンソールに出力されると誤解を招くのでそれをやめさせたいのですが、何か良い方法はないでしょうか? 色々試しましたが簡単な方法は無い様な気がしています。 [コマンド] set list = `ls *.s | sed -n 's/\.s//p'` [例] (1) OKケース %>ls *.s aaa.s bbb.s 結果==> aaa bbb (2) NGケース %> ls *s ls: 照合パターンに合いません. [とりあえずやりたい事を実現する方法] ls *.s >& /dev/null if($status == 0) then # ls is matched set list = `ls *.s | sed -n 's/\.s//p'` endif ※ 冗長でかつ処理速度が遅いという問題があろうかと思います。 [以前の質問] http://www.okweb.ne.jp/kotaeru.php3?q=825419 以上宜しくお願いいたします。

みんなの回答

回答No.6

あれれ、ls|sedしてからSTDERRを/dev/nullに捨てるのは簡単でしたが、lsの時点で捨ててSTDOUTだけを引き渡すのは難しいですね!!自信ありだったのにすみません。 No.5で紹介されているリンク先では一発めに問題点としてあがっていますね。 私は大学時代にBSDを使っていてCシェルがメインでしたが、仕事やシステム管理をするようになってからはkshかbashを使っています(^^;

  • pawooon
  • ベストアンサー率25% (1/4)
回答No.5

こんな簡単なこともできないcshはプログラミングでは使うなといことですね。 どうしてものときは ( hoge.sh > /dev/tty ) > & /dev/null のようにシェル全体をやるしかないでしょう。

参考URL:
http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/
  • you-m
  • ベストアンサー率58% (190/327)
回答No.4

#1です。 手元の環境にて、以下のようなテストスクリプトを作成して実行しています。 ##------------ #!/bin/csh echo '## 1 File Exist ##' touch aaa.s bbb.s set list = `ls *.s | sed -n 's/\.s//p'` echo $list rm *.s echo '## 2 File Not Exist ##' set list = `ls *.s | sed -n 's/\.s//p'` echo $list touch aaa.s bbb.s echo '## 3 File Exist ##' set list = `(ls *.s | sed -n 's/\.s//p' > /dev/tty) >& /dev/null` echo $list rm *.s echo '## 4 File Not Exist ##' set list = `(ls *.s | sed -n 's/\.s//p' > /dev/tty) >& /dev/null` echo $list ##------------ 以下は実行結果です。 {134}# csh list_get.csh ## 1 File Exist ## aaa bbb ## 2 File Not Exist ## ls: No match. ## 3 File Exist ## aaa bbb ## 4 File Not Exist ## {135}# tcsh list_get.csh ## 1 File Exist ## aaa bbb ## 2 File Not Exist ## ls: 照合パターンに合いません. ## 3 File Exist ## aaa bbb ## 4 File Not Exist ## 環境は、FreeBSD2.2.8のcsh及びtcshにて確認しました。 あと、Cygwin上のtcshでも確認できています。 若干データの格納のされ方に違いがあるものの、きちんと取得は出来ていますし、一応の目的は達せられていると思います。 やっていることは決して特殊なことではないので、普通はこれで動くと思うんですが・・・

回答No.3

lsの結果がマッチしなかったときに出力されるメッセージは標準エラーに書かれます。cshの操作で、標準出力と標準エラーの振り分けの基本形は ( コマンド > 標準出力 ) >& 標準エラー これを応用するとNo.1でかかれているように、標準出力はTTYへ、エラーはブラックホールへ振り分けということができるわけです。

tk_1980024
質問者

お礼

有難うございます。 はい、基本形はその通りであると認識していますが、この標準出力のみを取り出すことが出来ずに困っています。試しに以下のようにして見てください。/dev/ttyへ取り出した出力はその後のパイプで取得が出来ていません。なぜならパタンマッチが行われていないからです。 [試行1] touch aaa.s bbb.s; ((ls *.s > /dev/tty) >& /dev/null) | sed -n "s/\.s//p" [試行2] touch aaa.s bbb.s; (ls *.s | sed -n "s/\.s//p") >& /dev/null ninja_ex250さんの通りの動作であれば結果は aaa bbb と期待されますが実際には aaa.s bbb.s あるいは <<blank>> となります。 以上引き続き宜しくお願いいたします。

  • pawooon
  • ベストアンサー率25% (1/4)
回答No.2

set list =`find . -name "*.s" -exec ls {} \; | sed -n 's/\.s//p'` でどうでしょう?

  • you-m
  • ベストアンサー率58% (190/327)
回答No.1

こんなやり方は如何でしょうか set list = `(ls *.s | sed -n 's/\.s//p' > /dev/tty) >& /dev/null`

tk_1980024
質問者

お礼

有難うございます。 ただこの方法では何もlistへ入ってきませんでした。 だめの様子です。。。

関連するQ&A