プロが教える店舗&オフィスのセキュリティ対策術

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で行っています。

A 回答 (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はシェル変数ではないから?
    • good
    • 0
この回答へのお礼

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

以上有難うございました。

お礼日時:2003/08/25 02:59

私も最近cshはご無沙汰なので自信なしですが、



No.1さんの
> その機能はインタラクティブシェルとして使用した時のコマンドラインヒストリに対する機能です。
というのは間違いだと思います。
ご質問の機能はヒストリー機能とは別のものです。

また、$0はスクリプトの引数(コマンドを含む)を示すものですので、
sourceを使ったのではむしろダメだと思います。

echo "usage of ${0:t}"
とか
set a = $0
echo "usage of $a:t"
とか試されてみては。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/08/25 02:56

cshは普段使っていないので参考になるかわかりませんが、、、



その機能はインタラクティブシェルとして使用した時のコマンドラインヒストリに対する機能です。
したがって、スクリプトインタプリタとしてcshを使用した場合は使えないと思います。

さて、ここから先はcshというよりunixの話ですが、
cshのコマンドラインからcshスクリプトを呼び出した場合どうなるかというと、OSがスクリプトの先頭行を見て新しい/bin/cshプロセスを起動してスクリプトを実行します。

つまり、コマンドラインを出していたcshとスクリプトを実行しているcshは別プロセスであり、前者のコマンドラインのヒストリは後者のcshと無関係です。
ちなみに、2のスクリプトもsourceを使って呼び出せばうまくいくかもしれません(未確認)

なお、ご質問のような処理をしたい場合は通常cshのビルトイン機能ではなく、basenameコマンドを使います。
例) echo "usage of `basename $0`"

ちなみに個人的には、スクリプトはcshよりshで書いた方がいいと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/08/25 02:54

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