
実は以下にも同じ質問があったのですが、回答がついてなかったので改めて質問させて頂きます。
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件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
あれれ、ls|sedしてからSTDERRを/dev/nullに捨てるのは簡単でしたが、lsの時点で捨ててSTDOUTだけを引き渡すのは難しいですね!!自信ありだったのにすみません。
No.5で紹介されているリンク先では一発めに問題点としてあがっていますね。
私は大学時代にBSDを使っていてCシェルがメインでしたが、仕事やシステム管理をするようになってからはkshかbashを使っています(^^;
No.5
- 回答日時:
こんな簡単なこともできないcshはプログラミングでは使うなといことですね。
どうしてものときは
( hoge.sh > /dev/tty ) > & /dev/null
のようにシェル全体をやるしかないでしょう。
参考URL:http://www.faqs.org/faqs/unix-faq/shell/csh-whyn …
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へ、エラーはブラックホールへ振り分けということができるわけです。
有難うございます。
はい、基本形はその通りであると認識していますが、この標準出力のみを取り出すことが出来ずに困っています。試しに以下のようにして見てください。/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>>
となります。
以上引き続き宜しくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
cronでftp自動転送を行いたい
-
PHP4の Warning: pg_freeresul...
-
Bシェル内でのユーザー変更
-
Bシェルにてユーザの実行可否
-
Bシェルでパイプ→exitがうまく...
-
scpコマンドでリモートサーバの...
-
Viで書き込もうとすると、保...
-
【ターミナル】MacBookにディー...
-
findでエラー
-
FTP接続中のコマンド実行結果を...
-
AIX ksh利用 grep 検索で マ...
-
kshのファイルが存在しない時
-
Red Hat Linux 9でcd-romをマウ...
-
月毎のログファイルサイズの平...
-
メールサーバの/var/spool/mail...
-
DATメディア内のファイルを消去...
-
UNIXシェル内での日付計算
-
CPUのbit数を調べるコマンド
-
CGIへのコンパイルエラー
-
Windows10のRegSys32に登録され...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
コマンド終了ステータス
-
実行中のシェルスクリプト自体...
-
OSがプログラムをどのように実...
-
UNIX Cシェルで実数の比較
-
デフォルトシェルの調べ方
-
cshの標準出力を制御したい
-
Bシェルでパイプ→exitがうまく...
-
telnet へのパイプができないです
-
Shellのパターンマッチについて
-
FTPコマンドの戻り値について
-
diskpart でパーティションの一...
-
Bシェル内でのユーザー変更
-
IFS変数について詳しい方教えて...
-
シェルの実行について
-
cygwinシェルスクリプト内での...
-
csh(Cシェル)のevalに関して
-
cshで変数名の入れ子ができない
-
vagrant upでエラーが表示され...
-
cronでftp自動転送を行いたい
-
Mac OSXのターミナルでemacsを起動
おすすめ情報