2

以下のスクリプトのエラーを知りたい

としてエラーが発生し: command not foundh: line 1:: command not foundh: line 2:その連続

私は追加しようとし;ましたが、今は何をすべきか親切に教えてくれますか??

#!/bin/bash;
clear;
FILEREPO=http://192.168.1.2/cpplugin;

echo "-----------------------------------------------";
echo " Welcome to C-Panel Login Alert Installer";
echo "-----------------------------------------------";
    cd /var/cpanel/;
    mkdir perl5
    cd perl5/
    mkdir lib
    cd lib/
    wget $FILEREPO/LoginAlerthook.zip
    unzip LoginAlerthook.zip
    rm -r LoginAlerthook.zip
    cd /
    /usr/local/cpanel/bin/manage_hooks add module LoginAlert
    chmod 777 LoginAlert.pm
    echo " "
    echo " Login Alert Script Hooked With C Panel Finished"
    echo " "
4

5 に答える 5

13

おかしな出力が得られているという事実は、スクリプトの行末にキャリッジ リターン (CR) 文字が含まれていることを示しています。これは、通常、行末が単にではなく CR/LF である必要があると想定する Windows エディターを使用する場合の症状です。標準の UNIX LF (改行)。それは次のようなエラー出力を引き起こしています:

this_command_ends_hh<CR>: command not found

CR はカーソルを行頭に戻すため、一部を上書きします。

this_command_ends_hh<CR>
: command not found

作る:

: command not foundh

スクリプトod -xcb scriptnameを調べて CR ( として表示\r) 文字をチェックします。スクリプト出力をパイプして実際のod -xcb出力を確認することもできます。たとえば、私が作成したファイルの後に、唯一の行にキャリッジ リターンが続きます。hello

0000000    6568    6c6c    0d6f    000a
          h   e   l   l   o  \r  \n
        150 145 154 154 157 015 012
0000007

そこに CR ( \r) が表示されます。

それ問題の場合は、パイプを介して CR 文字を削除するだけtr -d '\r'です。

実行cat hello.txt | tr -d '\r' | od -xcbすると、それを取り除くことができることが示されます。

0000000    6568    6c6c    0a6f
          h   e   l   l   o  \n
        150 145 154 154 157 012
0000006

あなたの場合、スクリプトが呼び出されたと仮定するとfreak.bash、次を使用します。

tr -d '\r' <freak.bash >newfreak.bash

そしてnewfreak.bash、問題のあるキャラクターのないものになります。

于 2013-02-09T04:51:07.080 に答える
1

paxdiablo はほぼ間違いなく正しいです。行末を修正する必要があります。しかし、最初の行に誤ったセミコロンもあります。それ以外の:

#!/bin/bash;

あなたがしたい:

#!/bin/bash

末尾のセミコロンなし。

于 2013-02-09T05:23:23.617 に答える
1

デバッグのためにこのスクリプトの実行で何が起こっているかを理解するために使用できるツールは、コマンドです。

bash -x scriptname.sh
于 2013-02-09T04:40:44.943 に答える
0

私は現在 Centos 5 を持っていませんが、もしかしたら... bash が /bin にないのでしょうか? FreeBSD では、/usr/local/bin にあります。Cygwin では、/usr/bin にあります。このコマンドの出力は次のとおりです。

which bash
于 2013-02-09T04:46:33.813 に答える
0

paxdiablo と William Pursell は、何が問題なのかをうまく説明してくれました。

配布する場合は、時間をかけてスクリプトを改善してください。

テストされていない例:

#/bin/bash

ZIPFILE=http://192.168.1.2/cpplugin/LoginAlerthook.zip
CPANEL_LIBDIR=/var/cpanel/perl5/lib
MANAGE_HOOKS_CMD=/usr/local/cpanel/bin/manage_hooks

TMPFILE=`tempfile`

function exit_with_error(){
   echo "$*" >&2   # Write error messages to stderr!!
   exit 1
}

function at_exit(){
  [ -f "${TMPFILE}" ] && rm -v ${TMPFILE}
}

# Run at_exit function when script finishes
trap at_exit 0

echo "WELCOME TO ZOMBO.COM"

# Create lib directory if not exists, exit if not possible
if ! [ -d "${CPANEL_LIBDIR}" ]; then
     mkdir -p ${CPANEL_LIBDIR} || exit_with_error "Couldn't create required directory [${CPANEL_LIBDIR}]"
fi

wget ${ZIPFILE} -O ${TMPFILE} || exit_with_error "Couldn't download file"
unzip -d ${CPANEL_LIBDIR} ${TMPFILE} || exit_with_error "Couldn't unzip file"
chmod +x ${CPANEL_LIBDIR}/LoginAlert.pm || exit_with_error "Couldn't chmod file" 
$MANAGE_HOOKS_CMD add module LoginAlert

echo "End."

これは単なる汚い例です。マンページを読んで改善してください。

man bash
man tempfile
man wget
man unzip
man chmod
于 2013-02-09T06:21:06.563 に答える