プロが教えるわが家の防犯対策術!

実は以下にも同じ質問があったのですが、回答がついてなかったので改めて質問させて頂きます。

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

以上宜しくお願いいたします。

A 回答 (6件)

あれれ、ls|sedしてからSTDERRを/dev/nullに捨てるのは簡単でしたが、lsの時点で捨ててSTDOUTだけを引き渡すのは難しいですね!!自信ありだったのにすみません。



No.5で紹介されているリンク先では一発めに問題点としてあがっていますね。

私は大学時代にBSDを使っていてCシェルがメインでしたが、仕事やシステム管理をするようになってからはkshかbashを使っています(^^;
    • good
    • 0

こんな簡単なこともできないcshはプログラミングでは使うなといことですね。



どうしてものときは
( hoge.sh > /dev/tty ) > & /dev/null
のようにシェル全体をやるしかないでしょう。

参考URL:http://www.faqs.org/faqs/unix-faq/shell/csh-whyn …
    • good
    • 1

#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でも確認できています。
若干データの格納のされ方に違いがあるものの、きちんと取得は出来ていますし、一応の目的は達せられていると思います。
やっていることは決して特殊なことではないので、普通はこれで動くと思うんですが・・・
    • good
    • 1

lsの結果がマッチしなかったときに出力されるメッセージは標準エラーに書かれます。

cshの操作で、標準出力と標準エラーの振り分けの基本形は

( コマンド > 標準出力 ) >& 標準エラー

これを応用するとNo.1でかかれているように、標準出力はTTYへ、エラーはブラックホールへ振り分けということができるわけです。
    • good
    • 0
この回答へのお礼

有難うございます。
はい、基本形はその通りであると認識していますが、この標準出力のみを取り出すことが出来ずに困っています。試しに以下のようにして見てください。/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>>
となります。

以上引き続き宜しくお願いいたします。

お礼日時:2004/06/22 19:01

set list =`find . -name "*.s" -exec ls {} \; | sed -n 's/\.s//p'`


でどうでしょう?
    • good
    • 0

こんなやり方は如何でしょうか



set list = `(ls *.s | sed -n 's/\.s//p' > /dev/tty) >& /dev/null`
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/06/22 18:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!