• ベストアンサー

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

  • cshの詳しいサイトはありますか?

    指定のpathにあるバッチをcshから呼び出したいのですが、cshで文字列連結の方法がわかりません。 #!/bin/csh path = "./" path+batch1.csh $1 本当は、バッチのpathは別ファイルに書いて置き、そのファイルを呼び出して変数名pathに格納したいのですが、cshに詳しいサイトはありますでしょうか?

  • cshのエラー、どういうこと?

    シェルスクリプトはまったくの初心者です。 書籍についてきたCDに入っていたシェルスクリプトを実行させようとすると、次のエラーが出ます。 'nkown option: `- Usage: csh [ -bcdefilmnqstvVxX ][ agument ...]. そのスクリプトの出だしはこんな感じです。 #! /bin/csh -f if ($2 == "") goto nosize if ($2 == "n") catsiz n d $2 $1 if ($2 == "n") catsiz n d $2 sfstor if ($2 == "s") catsiz s d $2 $1 if ($2 == "s") catsiz s d $2 sfstor ・ ・ web上の入門サイトなどにあるのを参考に #! /bin/csh -f echo "you typed $1." というようなのを作ってみたら、これはちゃんと動きます。 パスの設定等にも問題はないと思っているのですが… どなたかこのエラーを回避する方法を教えてください。

  • csh(Cシェル)のevalに関して

    evalを用いてインクルード的な事を行いたいのですが、「コマンドが見つかりません」が出てきて困っています 原因はなにがあるのでしょうか? 色々ネットで調べて同じように記述したつもりなのですが csh初心者で申し訳ありませんが 使い方が悪いのか、環境が悪いのか?判断できません 環境は別の人に作って貰ったんで、環境なら環境から勉強していきたいと考えてます ■TEST010.csh #!/bin/csh echo "TEST010-Step0010" eval `./TEST000.csh` echo "TEST010-Step0020" echo " set root_path $root_path;" echo "TEST010-Step0090" ■TEST000.csh #!/bin/csh set lcmoji01 = /export/home/tbn/km echo "set lcmoji01 $lcmoji01;" ■実行結果 > csh TEST010.csh TEST010-Step0010 ^M: コマンドが見つかりません。 TEST010-Step0020 lcmoji01: 未定義の変数

  • awkからcshへの複数値返却

    スペースデリミタのデータファイルをcsh+awkで解析する機能を作っているのですが、shのreadを使った場合のように、複数の値をshell側に返す方法がわかりません。 例)shの場合(本当はva1,val2は1つの変数に設定したいので、あくまで例) ------------------------------------- % less list KIND1 YES NO KIND2 NO YES % less echo_hoge.sh #!/bin/sh while read val1 val2; do ←★このval1 val2に設定する手段がcshで見つからない echo $val1 $val2; done < list ------------------------------------- cshでスペースデリミタでかつ使用不可文字なしのデータファイルを行単位に処理するのは難しいと考え、awkを使って処理しようと考えたのですが、awkだと1つの処理結果しかshell変数に設定できない(ように思える)ため、困っています。 例)csh+awk ------------------------------------------------ set kind1 = `cat list | awk '{ if ( $1 == "KIND1" print $2 $3)}'` set kind2 = `cat list | awk '{ if ( $1 == "KIND2" print $2 $3)}'` ------------------------------------------------ 上記のように2回読まずにうまくshell変数に設定する方法がないか教えてください(sh使用は政治上の理由でNGです)。 よろしくお願いします。

  • system関数で呼びだした、cshファイル周辺でのエラー

    2~3日前にも質問させていただいた、Perl初心者leeeeeeeeです。先日に引き続き、前の業者が作ったPerlプログラムを、新しいサーバ上で動くようにする作業を行っているのですが、まだエラーが出ており困っています。以下が問題の部分です。 ○○.cgi # 削除シェルの実行 $rtn = system"$rm_csh $tmp_file $limit_date $touch_file"; if($rtn != 0) {  # エラーログ出力  cm_errlog(__FILE__, "LOG013", ($rm_csh." ".$limit_date));  # エラーHTML出力  省略  # 異常終了  exit 1; } ここの、$rtnが、0になっていないようで、エラーページが表示されてしまいます。 ちなみに、$rm_csh は、tmpdel.cshというファイルで、以下が中身です。 ■ tmpdel.csh #!/usr/bin/csh set touch_fname = $3 set tmp_file = $1 touch -t $2 $touch_fname >& /dev/null set STS = $status if( $STS != 0) then exit 1 endif foreach file_name (`ls $tmp_file*`)  test $file_name -ot $touch_fname && rm $file_name >& /dev/null end exit 0 ■ tmpdel.csh の #!/usr/bin/csh という部分が気になって、#!/usr/bin/perlとか、 #!/bin/cshにもしてみましたが動きませんでした。 何が原因でエラーが出ているのかが分かりません。 宜しくお願いします。

  • NTのバッチを会話形式にしたい

    WindowsNT4.0(SP6)で、バッチファイルを作ろうと思っています。 会話形式で標準入力からの入力待ちで処理を止めたいのですが、どうしたらいいのでしょうか? Solarisなら下のような感じなのですが、Windowsではどうやったらいいのかわかりません。 どうか教えてください。 Solaris(csh)の場合・・・ #!/bin/csh echo -n "年齢入力" set innum=$< # if ($innum < 19)then echo "あなたは成人ではありません" else echo "あなたは成人です" endif exit

  • echoの出力は標準エラー出力ですか?

    例えばsamp.cshのようなc-shellスクリプトを作成、 samp.csh | less のようにすると、echoの行が表示されないのに対して samp.csh |& less とすると表示されました。 echoは例によって色々なバージョンがありそうですが、man を見る限りechoの出力に関して特別な記述が有りません。 echo is a shell built-in /usr/local/bin/echo /bin/echo /usr/bin/echo /usr/ucb/echo echoコマンドはデフォルトで標準エラー出力なのでしょうか?これを標準出力にするオプションは無いのでしょうか?もしくはどのエコーを使うと解決するのでしょうか? --[samp.csh] #! /bin/csh -f foreach a ($aa) echo "$a" diff $work/$a $TRY1_CENTER/syn/ end システム Release: 5.7 Kernel architecture: sun4u Application architecture: sparc Kernel version: SunOS 5.7 Generic 106541-17 June 2001

  • ブラウザからバッチ起動時のPathについて

    クライアントのPCからブラウザ上でボタンをクリック するとサーバー上のバッチを起動するようにしていますが、サーバー上で直接バッチを起動した場合は正常に動作しています。しかし、ブラウザから起動した場合には一部が正常に動作してくれません。 ブラウザから起動したバッチ上で echo %path% > c:\aaa.txt としてPathを確認しようとしたら「echoはONです」と 出力されていました。 直接起動した場合は環境変数のPathが出力されます。 環境変数で指定しているPathは使えないのでしょうか? ご存知のかたがいらっしゃいましたらご教授お願い致します。 【バッチの内容】 set DT=%date:~2,4%%date:~7,2%%date:~10,2% if "%time:~0,1%"==" " set TM=0%time:~1,1%%time:~3,2%%time:~6,2% if "%time:~0,1%"==" " GOTO :P1 set TM=%time:~0,2%%time:~3,2%%time:~6,2% :P1 set DirName=C:\backup\%DT%_%TM% mkdir %DirName% echo %path% >C:\hammy\hammy.txt aaa.exe 引数 ←ここが正常に動作しない

    • ベストアンサー
    • Java
  • "java" が実行できません("java.exe" は実行できる)

    先日 J2SDK 5.0 Update 6 をインストールした際、 この問題に遭遇しました。 PATH も CLASSPATH も正常に設定されています。 しかし、"java" が実行できません。 ところが、"java.exe" とすると実行できます。 これはいったいどういうことなのでしょうか? 以下にいくつかの実行例を載せます。 OS は Windows XP SP1 です。 [実行例] C:\>java [結果] 'java' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 となるのですが、.exe をつけると以下のように Usage が表示されます。 [実行例] C:\>java.exe [結果] Usage: java [-options] class [args...] (to execute a class) 以下、絶対パス指定した場合も同じ結果です。 [実行例] C:\java\jdk1.5.0_06\bin\java [結果] 'C:\java\jdk1.5.0_06\bin\java' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 [実行例] C:\java\jdk1.5.0_06\bin\java.exe [結果] Usage: java [-options] class [args...] (to execute a class)

  • Pathの記述の仕方

    以下のようなパスの記述をしても問題ないでしょうか? /aaa/bbb/ccc/.../.../bbb/ccc/config.txt 理由としては、以下のシェルのようにconfigファイルを読み込むのに dirnameコマンドを使用して取得するためです。 このコマンドは、コマンドラインから実行する場合と、JOBNETなどの別プロセス(実行ディレクトリは別ディレクトリ)から実行される可能性があります。 Sample.csh #!/bin/csh set SHELL_PATH = `dirname $0` set APP_ROOT = ${SHELL_PATH}"/../.." setenv SERVER_INFO_FILE ${APP_ROOT}"/aaa/bbb/config.txt sample.exe ご回答宜しくお願い致します。