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

このQ&Aのポイント
  • シェルスクリプト初心者の方がcshエラーに遭遇しました。具体的なエラーメッセージは「nkown option: `-」です。
  • エラーメッセージの原因として、スクリプトの先頭部分に記述された「#! /bin/csh -f」という行が関係している可能性があります。
  • 他のサンプルコードを参考にして作成したシェルスクリプトでは正常に動作していることから、パスの設定などに問題はないと思われますが、具体的な回避方法についてアドバイスをいただきたいです。
回答を見る
  • ベストアンサー

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." というようなのを作ってみたら、これはちゃんと動きます。 パスの設定等にも問題はないと思っているのですが… どなたかこのエラーを回避する方法を教えてください。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.2

#1です。 何らかのタイプミスがないとすると、改行文字が CRLF になっているのを unix/linux で実行しようとしているとか。 今手元に unix/linux がないので確認できませんが、もしそうならそういう状況になるような気がします。 -f ありのときはその後にCRがあるのでCRが不正なオプションとみなされ、-f 無しの時は /bin/cshにCRがくっついたものがファイル名とみなされ、そんなファイルはない。 CR の削除は、tr -d '\015' <file >outfile か、tr -d '[\015]' <file >outfile のどちらかでできると思います。

ash_ef
質問者

お礼

バイナリを見てみるとその通りでした。 CRを消すことによりスクリプトは実行されました。 ありがとうございます。 -fがあるときは"-f[CR]"というオプションがないと言っていて、-fをとったときは"/bin/csh[CR]"というコマンドがないと言っていたということですね。 コンピュータは正直です。

その他の回答 (1)

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.1

2行目に、set echo verbose を入れるとどの行でエラーが出ているかがわかると思います。 いずれにせよ、cshで複雑なスクリプトを書くと直感的な動きをしないことがままあるはずなので、止めたほうがいいでしょう。スクリプトについては sh の方が高機能だし。

ash_ef
質問者

補足

回答ありがとうございます。 2行目に書き込んで実行したところ、同じメッセージが得られました。 念のため3行目に、"echo "test"といれましたが画面に表示されないということもあり、1行目に問題がありそうだとわかりました。 1行目を"#! /bin/csh -f"から"#! /bin/csh"にすると、スクリプトを実行してもcommand not foundと出てしまいます。同じディレクトリで"./"も付けて実行しているのに! まったく理由が分かりません。 自分で作った簡単なスクリプトは"#! /bin/csh -f"でも何の文句も言われないのに。 shが高機能だというアドバイスを頂きましたが、スクリプトが自作のものでないので、今回はどうにかしてcshで動かさなくてはならないという事情があります。

関連するQ&A

  • CSHの環境変数の設定

    CSHで外部で定義したconfigファイルから変数を読み込み そのシェル及び子シェル内で有効な変数として使用したのですが どのような方法がありますでしょうか? 以下の方法だと親シェルからでは子シェルで設定した変数が読み込めないため困っています。 config.csh #!/bin/csh -f setenv AAA aaa test.csh #!/bin/csh -f set APP_ROOT = `dirname $0` cd $APP_ROOT set CONFIG_FILE=$APP_ROOT"/config.csh" echo $AAA

  • 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にもしてみましたが動きませんでした。 何が原因でエラーが出ているのかが分かりません。 宜しくお願いします。

  • csh foreachで「*」でエラーとなる

    シェルの初心者です。よろしくお願い致します。 cシェル(csh)で、リストをforeachで1行ずつ取得しているのですが、「*(アスタリスク)」の値があると「一致しません」とエラーで落ちてしまいます。 「*(アスタリスク)」も正常に読んで、ループを回すことはできないのでしょうか? foreach FILE ( \"`/bin/cat リストファイル名`\" ) リストは「|(パイプ)」区切りにしてあります。 foreachで一行ずつ、読んでループしています。 ご存知の方は、お力をお貸し下さい。 よろしくお願い致します。

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

  • MinGW,msysでCスクリプトの実行

    windows上でCシェルスクリプトで書かれたファイルを実行する必要が生じました。 これまではcygwin上で難なくやっていたのですが、cygwinは大きいので、これをやめてMinGWにしたため、Cシェルスクリプトが流れなくて困っています。MinGW、msysにはCシェルは無いようです。そこで、MinGW,msys,minttyの環境下で以下のようにやってみたのですが、これでよいのでしょうか? (1)MinGW,msys,minttyをインストール(Bシェルの環境ができる) (2)tcsh.exeをwebからダウンロード(ftp://ftp.funet.fi/pub/unix/shells/tcsh/) (3)tcsh.exeをmsysの/binに入れて、cshにハードリンクを張る(#ln tcsh.exe csh) これで簡単なCシェルスクリプトは流れるようですが、そのCシェルスクリプトの中で、さらにスクリプトファイルを実行させるようなスクリプトはうまく流れません。結局、試行錯誤の結果、以下のように、csh,shを頭に付加してようやく流れるようになりました。 ・元のファイル(script-a,bは流れない) #!/bin/csh -f ........... ./script-a(Cシェル) ./script-b(Bシェル) ........... ・修正後(ようやく流れた) #!/bin/csh -f ........... csh ./script-a(Cシェル) sh ./script-b(Bシェル) ........... 何故このようにしなければいけないのか?また、minttyでCシェルスクリプトを流す方法はこれでよいのか?(他に方法はないのか?)ご教示頂ければと思います。 当方、シェルスクリプトは全く素人で質問自体が的外れかもしれませんがよろしくお願いします。

  • cshが詳しい方は教えてください

    cshが詳しい方は教えてください cshで、ソラリスOS上にtmp.outってのファイルを行ずつに読み込みしたいんですが foreach f_list("`cat tmp.out`") echo "${f_list}" end tmp.outの内容は以下です。 test3 if ( 0==mencmp("H",HOSTN,10) { test345 testddd … 2行目の最後"{"っての文字があれば、実行すると、うまくいけませんが。 『}が足りません。』ってのエラーになっちゃう、 "{"がcsh中で、特殊の文字と思ってますが、cshが詳しいかは対処方法を教えてくれませんか 以上です。よろしくお願いいたします。

  • 『存在するかどうか分からない』環境変数にcshで新しいパスを設定したい

    Linuxを利用しており、「『存在するかどうか分からない』環境変数に新しいパスを設定したい」のですが、うまくいきません。 言い方を変えると、対象の環境変数が存在しようが存在しまいが、うまくいくようにしたいのです。 具体的には、ログインシェルに tcsh を使用しているため、hogehoge.cshを作成し、/etc/csh/login.d/に入れました。hogehoge.cshの内容は以下のようになります。 #!/bin/csh setenv HOGEHOGEPATH /usr/lib/hogehoge:${HOGEHOGEPATH} ログインしてみると HOGEHOGEPATH: Undefined variable. といった内容のエラーが表示され、環境変数も設定されません。 shで設定する方法もありますがcshで良い書き方はないでしょうか。ご教示お願いいたします。

  • Perlをcshスクリプトに書きなおしたい

    以下のPerlで書かれたCGIをcshスクリプトに書き直したく思っています。 #!/usr/local/bin/perl # load libraries require ("/usr/local/bin/cgi-lib.pl"); # cancel stdout buffering $| = 1; # header response print "Content-type: text/html\n\n"; print STDOUT "<HTML><HEAD></HEAD><BODY>\n"; &ReadParse; open(COMM, "|./message > ./message.out") || die; $in_text = $in{"Name"}; print COMM "Name: $in_text\n"; ... "Name"という変数名で受け取った文字列を$in_textに代入している ようですが、この辺りの処理、cshではどう書けばよいのでしょうか。

    • ベストアンサー
    • CGI
  • ロケールをutf8からsjisにするとログイン時に「イベントがありません」エラー

    こんにちは。私はLinux CentOS5を使っています。 あるユーザ(aaaとする)でログインシェルを/bin/cshにしています。 システムロケールをUTF8からSJISに変更すると(i18nファイルを変更しました)、 [aaa@centos ~]$ su - aaa パスワード: ~: イベントが見つかりません. となってcshスクリプトなどが使えず、/home/aaa/.cshrcも正常に読み込まれないようなので、/home/aaa/.cshrcで書いているPATHなどが通っていません。 わからないのは、システムロケールがUTF8の時は問題なくログインして.cshrcもちゃんと読めていたのに、SJISにするとエラーが起こることです。 どうかよろしくお願いします。

  • Cシェルについて

    Cシェルについて #! /bin/csh ##! /bin/csh -vx setenv NOHUP '/usr/bin/nohup' set AAA_CSH = $NOHUP' XXX.sh file.txt &' ($AAA_CSH >> /dev/null) >>& err.log シェルスクリプトを作成して上記のとおりnohupでXXX.shを実行するように記述します。 エラーがあった場合、err.logに出力するように作成したつもりなのですが、 XXX.shがなかったとき、 「/usr/bin/nohup: XXX.sh:そのようなファイルまたはディレクトリはありません。」 と標準出力されてしまいます。 このエラーメッセージをerr.logに記述するようにしたいのですが、 どうしたらよいでしょうか? よろしくお願いいたします。

専門家に質問してみよう