• ベストアンサー

cshのパス名指定子

cshプログラムの :t(:gt, :h ...)などパス名指定子の仕様に関して教えて頂きたく思い投稿いたしました。 これらの演算子はフルパス表示からフアイル名部の文字列を 取り出す際に(/bin/ls-->ls)単に最後のスラッシュより前の部分を省略するという処理ではないのでしょうか? 例1のような場合はOKなのですが例2のような場合は利かないのです!! 変な引数を与えられた場合にバッチスクリプトの使い方をechoするところで$0を使いたいのですが、このコマンドはどのような場所から実行されるか分からないので、:t を用いてバッチファイル名だけを表示させたいと思っています。 [1: OK例] set qqq = (/opt/sfw/etc/* ) echo "$a:gt" -<結果>--- enscript.cfg esd.conf fnrc ftpaccess ftpconversions ... [2: NG例] test.csh #! /bin/csh -f echo "usage of $0:t" --<結果> --- usage of /export/home/matumoto/study/csh/dirFlag.csh:t 以上、宜しくお願いいたします。 ※ 作業はsolaris 8で行っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • gaktank
  • ベストアンサー率65% (23/35)
回答No.3

#2さんの回答(後者のほう)でOKです。 >set a = $0 >echo "usage of $a:t" 他にも、/usr/bin/basenameを使うという手もあります。 echo "usage of `basename $0`" Bシェル等ではこの方法ですね。 $0には、:tなどの修飾子が効かないようです。 ちなみに引数の$1($argv[1])は修飾子は効きます。 #$0はシェル変数ではないから?

tk_1980024
質問者

お礼

$0には:tは利かないのにいったん別の変数にすると利くというのは余り直感的でなく、C-SHELLは作りこみが甘いといわざるを得ないと思わず思ってしまいました。 今回の一件で以下を学ぶことが出来ました。 "basename $0"が使える $0からいったん他の変数に乗せかえると:tが使える $1以降なら使える 以上有難うございました。

その他の回答 (2)

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.2

私も最近cshはご無沙汰なので自信なしですが、 No.1さんの > その機能はインタラクティブシェルとして使用した時のコマンドラインヒストリに対する機能です。 というのは間違いだと思います。 ご質問の機能はヒストリー機能とは別のものです。 また、$0はスクリプトの引数(コマンドを含む)を示すものですので、 sourceを使ったのではむしろダメだと思います。 echo "usage of ${0:t}" とか set a = $0 echo "usage of $a:t" とか試されてみては。

tk_1980024
質問者

お礼

アドバイス有難うございました。 一番目の方法は既にご指摘ありましたとおり、"文法があいまい"との事でNGでしたが、2番目の方法ではOKでした。

  • shige_70
  • ベストアンサー率17% (168/946)
回答No.1

cshは普段使っていないので参考になるかわかりませんが、、、 その機能はインタラクティブシェルとして使用した時のコマンドラインヒストリに対する機能です。 したがって、スクリプトインタプリタとしてcshを使用した場合は使えないと思います。 さて、ここから先はcshというよりunixの話ですが、 cshのコマンドラインからcshスクリプトを呼び出した場合どうなるかというと、OSがスクリプトの先頭行を見て新しい/bin/cshプロセスを起動してスクリプトを実行します。 つまり、コマンドラインを出していたcshとスクリプトを実行しているcshは別プロセスであり、前者のコマンドラインのヒストリは後者のcshと無関係です。 ちなみに、2のスクリプトもsourceを使って呼び出せばうまくいくかもしれません(未確認) なお、ご質問のような処理をしたい場合は通常cshのビルトイン機能ではなく、basenameコマンドを使います。 例) echo "usage of `basename $0`" ちなみに個人的には、スクリプトはcshよりshで書いた方がいいと思います。

tk_1980024
質問者

お礼

どうも有難うございました。basenameという便利なコマンドがあるのを知りませんでした。 参考になりました。 > スクリプトインタプリタとしてcshを使用した場合は使えない とありましたが、他の方のご指摘がありましたようにこれはシェルスクリプトでもしよう出来るものとして解説がされています(Bil Joy著: C shell フィールドガイド にて)。

関連するQ&A

専門家に質問してみよう