新規無料会員登録で1000名様に電子コミック1000円分が当たる!!

以下の単純なシェルスクリプトを実行しようとしています。
-------------------
#!/bin/sh
echo ok
-------------------
そのとき、
bad interpreter: そのようなファイルやディレクトリはありません
と出てしまいます。

・which sh で確認すると /bin/sh です。
・Windowsで作ったファイルをFTPのアスキーモードで転送しています。

(ものすごく単純なミスをしてるのかもしれませんが、)
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

1行目の「/bin/sh」のうしろにCRが入っていると、このような現象が発生します。


FTPの転送モードが間違いなくアスキーモードになっているか、
転送後のファイルにCRがついていないかなど、再度確認してみてください。

CR以外のコントロールコードや全角スペースなどがついていても似た現象が起こります。
その場合はエラーメッセージが多少異なるはずですが、併せて確認しておくと良いかと思います。
    • good
    • 5

#2さんのCRに一票


改行コードが違う(1バイト多い)のだと思います

$ mv hoge.sh hoge.bk
$ tr -d '\r' < hoge.bk > hoge.sh
    • good
    • 4
この回答へのお礼

秀丸で改行コードをLFに変換し、
バイナリモードで転送するとうまくいきました。

CRがクセモノだったわけですね。

みなさん、ありがとうございました。

※素直にLinuxのエディタを勉強したほうがいいですね。。。

お礼日時:2007/06/25 17:01

ぱっと思いつく原因は2つ 例えばfile名が test.sh だとして


1. Windowsと違ってカレントディレクトリは通常pathが通っていませんので
 test.shの有るディレクトリから実行させる場合も
 $ test.sh <=これだと駄目
 $ ./test.sh  <=これならOK

2.アスキーモードで転送したはずがうっかり間違えていた
この場合 1行目のshebang文は
#!/bin/sh\r\n となり /bin/sh[CR]を探しに行きますが当然有りませんので
エラーになります
これを確認するためにはコマンドラインで
$ od -c ./test.sh
と打つと
0000000 # ! / b i n / s h \n e c h o o
0000020 k \n
これならOKですが \r が入っていれば Windows用の改行コードのままです。
    • good
    • 1

ただ単純にパスが通っていないだけだったりして...



パーミッションとパスを再度確認してください。
    • good
    • 2

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qbad interpreterで、シェルが使えません(T_T)

RedHat9ではよく以下のような胃の痛いような
エラーがでます。
rootでシェルが実行できないのですが、
どうすれば実行できるでしょうか?

■1.shというシェルファイル
#!/bin/sh
/bin/touch 1

■1.shを実行するとエラーになります。。
# ./1.sh
: bad interpreter: そのようなファイルやディレクトリはありません

■cronでも動きません。。
/bin/bash: 1.sh: /bin/sh: bad interpreter: No such file or directory

Aベストアンサー

/bin/shはありますか?

シェルスクリプトの最初の行(#!で始まる行)は、インタープリタの指定を意味しています。
つまり、#!/bin/shと書けば、「このファイルは/bin/shをインタープリタとする」ということです。

なので、
"/bin/bash: 1.sh: /bin/sh: bad interpreter: No such file or directory"
このエラーは、「/bin/bashが1.shを実行しようとしたが、/bin/shが無い」ということを意味しています(多分)。

RedHat9では、/bin/shは/bin/bashへのリンクなので、もし無ければ
ln -s /bin/bash /bin/sh
とすると良いでしょう。

Qsedの置換文字に変数を使用したいのですが・・・

あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。

例:
X="a"
Y="b"
echo test.txt | sed 's/${X}/${Y/g}' >test.txt

sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

Aベストアンサー

' ・・・' で囲まれた中の$はそのままドルマークです。変数展開をするなら、'・・・'で囲んではいけません。

何も囲まないか、"・・・"で囲むかです。

Q起動しているサービスを確認するコマンド

初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。

起動しているサービスを確認するために以下の2つのコマンドを打ってみるのですが、結果(出て来るサービス名)が違います。
このコマンドの違いについてご教示いただけますでしょうか。

(1)service --status-all
(2)chkconfig --list

Aベストアンサー

(1)service --status-all

サービスの現在のステータスを調べるコマンド

(2)chkconfig --list

OSのブート時に自動起動するサービスを調べるコマンド

違いが出るのは、
・ブート後に手動あるいは他のコマンドから起動したサービス
・ブート後に手動あるいは他のコマンドから、あるいはエラーで停止したサービス
・ブート後に実行はされるがすぐに停止して常駐しないサービス (ntpdate とか)

あるいは、(1)ではサービス名が表示されない物もあるので、どのサービスがどんなステータス出力をするのか知っておく必要もありますね。(service network statusとか)

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む

Qシェルの「:コマンドが見つかりません」エラー

TeraTermでシェル言語を実行したとき、
「:コマンドが見つかりません」というエラーが出ました。
何行目かとか、どのコマンドがとか、具体的にわかることはできないのでしょうか?

Aベストアンサー

sh -x スクリプトファイル名
で、スクリプト中の各コマンドが実行直前に表示されますので、それで大体わかると思います。
ただ、「:コマンドが見つかりません」という表示のすぐ左にそのコマンドが出ているはずです。もしかして、全角空白が入ってそれがエラーになってるとか?

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

Qなぜ、No such file or directory ?

LinuxにHORBをインストールし、パスも通しました。
HORBサーバーを起動するために
$ horb
と、すると
bash: /usr/local/horb2.1/bin/horb : No such file or directory
となって、実行できません。

horbファイルの中身は、
#!/bin/sh
java horb.orb.HORBServer $*
となっています。

直接、
$ java horb.orb.HORBServer
とすれば、HORBサーバーが起動します。

horbファイルの権限が理由でもないと思います。
$ ls -l horb
-rwxr-xr-x   1 myname   users
となっています。

なぜ、
$ horb
ができないのでしょうか。どうか、お教えください。

Aベストアンサー

そのエラーの出方は#!行がちゃんと解釈されないパターンに
見えますね。

改行コードをまず確認してみてください。samba経由かなにかで、
Windows上のエディタで編集してたりしてませんか?
$ vi horb
とviエディタなどで開いてみるとどうでしょう?あるいは
$ od -c horb | head
#!/bin/shのうしろに^Mとか\r\nが来ていませんか?

Qapt-get install ****** でinstallしたものをuninstallするには?

御世話になります。
vncserverだけをinstallするつもりが
誤って
apt-get install vncとうってしまいました。
これをuninstallしたいのですが
どのようにすればよろしいでしょうか?

教えて下さい。

Aベストアンサー

# apt-get remove パッケージ名
では、設定ファイルは削除されずに残ります。

完全に削除するときは、
# apt-get --purge remove パッケージ名
です。

Qポートの80と443

こちらのサービス(https://secure.logmein.com/)を利用すると、インターネットを見られるサーバーのポートの80と443が空いていればルータやファイアウォールに特段の設定なく外部からサーバーを操作できるそうですが、逆にサーバーのポートの80や443を空けることには何か危険性があるのでしょうか。

Aベストアンサー

ポート80は一般的なHTTP、ポート443はHTTPSです。
この2つのポートがあいていなければインターネット接続(WEBブラウジング)は出来ません。
ですから、ほとんどのファイアウォールでこのポートは開いています。(インターネット接続を制限している社内LANでは当然閉じていますが)

ちなみに、よく使うポートとしてはFTPで20、21、SMTP(送信メール)で25、受信メールPOP3で110あたりです。セキュリティポリシー上、この辺は制限される事も多いですが、HTTP 80、HTTPS(暗号化用)443は通常閉じません。


危険性?
WEBプロトコルを使ってFTP的なファイル転送(WebDAV)やVPN等も出来るようになっています。当然そこにはある種の危険はつきものですが、WEBブラウジングに伴う危険と大きく変わりません。ウィルス等に感染していればこの2つのポートだけでも相当危険でしょうね。

参考まで。

Qbashなどのシェル変数の値に改行を含める事は可能でしょうか?

タイトルの通りですが、通常のシェル変数の値として

 [prompt]$ aaa="bbb<改行>ccc"

のようなセットを行い、

 [prompt]$ echo $aaa
 bbb
 ccc
 [prompt]$

のような結果を得たいのですが、可能でしょうか。

Aベストアンサー

可能です.
というか,やってみたら出来ることがわかると思います.こんなところで聞くより早い.
なお,sh/bash系では改行文字は特にエスケープせずそのまま入れられます.

aaa='bbb
ccc'


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング