sh 파일에서 실행할 때 쉘 스크립트에서 찾을 수 없음 오류가 발생합니다. 그러나 수동으로 입력하면 명령이 작동합니다.


19

다음 스크립트를 사용하여 내 웹 사이트의 사이트 맵을 생성하려고합니다. sh thsitemap.sh다음과 같은 오류가 발생하여 실행 하면 빈 sitemap.xml 파일이 생성됩니다.

thsitemap.sh: 22: thsitemap.sh: [[: not found
thsitemap.sh: 42: thsitemap.sh: [[: not found
thsitemap.sh: 50: thsitemap.sh: Syntax error: "(" unexpected

그러나 root터미널에 이러한 줄을 수동으로 복사하여 붙여 넣을 때 동일한 사용자로 오류없이 작동하고 sitemap.xml 파일에 모든 URL이 있습니다. 뭐가 문제 야? 이 문제를 어떻게 해결할 수 있습니까?

#!/bin/bash
##############################################
# modified version of original http://media-glass.es/ghost-sitemaps/
# for ghost.centminmod.com
# http://ghost.centminmod.com/ghost-sitemap-generator/
##############################################
url="techhamlet.com"
webroot='/home/leafh8kfns/techhamlet.com'
path="${webroot}/sitemap.xml"
user='leafh8kfns'       # web server user
group='leafh8kfns'      # web server group

debug='n' # disable debug mode with debug='n'
##############################################
date=`date +'%FT%k:%M:%S+00:00'`
freq="daily"
prio="0.5"
reject='.rss, .gif, .png, .jpg, .css, .js, .txt, .ico, .eot, .woff, .ttf, .svg, .txt'
##############################################
# create sitemap.xml file if it doesn't exist and give it same permissions
# as nginx server user/group
if [[ ! -f "$path" ]]; then
    touch $path
    chown ${user}:${group} $path
fi

# check for robots.txt defined Sitemap directive
# if doesn't exist add one
# https://support.google.com/webmasters/answer/183669
if [ -f "${webroot}/robots.txt" ]; then
SITEMAPCHECK=$(grep 'Sitemap:' ${webroot}/robots.txt)
    if [ -z "$SITEMAPCHECK" ]; then
    echo "Sitemap: http://${url}/sitemap.xml" >> ${webroot}/robots.txt
    fi
fi
##############################################
echo "" > $path

# grab list of site urls
list=`wget -r --delete-after $url --reject=${reject} 2>&1 |grep "\-\-"  |grep http | grep -v 'normalize\.css' | awk '{ print $3 }'`

if [[ "$debug" = [yY] ]]; then
    echo "------------------------------------------------------"
    echo "Following list of urls will be submitted to Google"
    echo $list
    echo "------------------------------------------------------"
fi

# put list into an array
array=($list)

echo "------------------------------------------------------"
echo ${#array[@]} "pages detected for $url" 
echo "------------------------------------------------------"

# formatted properly according to
# https://support.google.com/webmasters/answer/35738
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<urlset xsi:schemaLocation=\"http://www.sitemaps.org/schemas/sitemap/0.9 
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"
xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">" > $path

echo ' 
   ' >> $path;
   for ((i=0;i<${#array[*]};i++)); do
echo "<url>
    <loc>${array[$i]:0}</loc>
    <lastmod>$date</lastmod>
    <changefreq>$freq</changefreq>
    <priority>$prio</priority>
</url>" >> $path
   done
echo "" >> $path
echo "</urlset>" >> $path

# notify Google
# URL encode urls as per https://support.google.com/webmasters/answer/183669
if [[ "$debug" = [nN] ]]; then
    wget  -q --delete-after http://www.google.com/webmasters/tools/ping?sitemap=http%3A%2F%2F${url}%2Fsitemap.xml

    rm -rf ${url}
else
    echo "wget  -q --delete-after http://www.google.com/webmasters/tools/ping?sitemap=http%3A%2F%2F${url}%2Fsitemap.xml"

    echo "rm -rf ${url}"
fi
echo "------------------------------------------------------"

exit 0

스크립트를 어떻게 실행합니까?
cuonglm

@Gnouc sh script.sh
THpubs

8
시도 : bash script.sh, shmake bash스위치를 posix 모드로 호출 하십시오. 이 유형의 질문에 대한 답변을 기억합니다. :이 참조 할 수 unix.stackexchange.com/questions/44836/...
cuonglm

답변:


35

다음과 같이 스크립트를 실행하십시오.

bash script.sh

또는 그냥 :

./script.sh

bash이름을 사용하여 실행되고 sh, 그것은 등으로의 확장의 대부분을 비활성화 [[테스트 연산자.

당신이 가지고 있기 때문에 #!/bin/bash오두막 라인을 명령 줄에 명시 적으로 쉘 인터프리터를 지정할 필요가 없습니다. 스크립트를 명령으로 실행하면 해당 행을 사용하여 쉘을 찾습니다.


-1

둘 다 ... if [[ debug = "...“ ]] ; then...명령이 잘못되어 있어야합니다 ...

if [ "debug" = "Y" -o "debug" = "y" ]

6
아니요, 코드는 유효한 bash이며 유효한 sh는 아닙니다.
glenn jackman

오류 1, 22 행에서 [[.
rhubarbdog

@rhubarbdog 파일에 #! / bin / sh가 있으면 파일에 #! / bin / bash가 있으면 if [[debug = "...“]]에 문제가 없어야합니다
Rajesh Hatwar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.