Kabuk betiği bir sh dosyasından çalıştırıldığında bulunamadı hatası verir. Ancak manuel olarak girilirse komutlar çalışır


19

Web sitem için bir site haritası oluşturmak için aşağıdaki komut dosyasını kullanmaya çalışıyorum. Ben böyle çalıştırmak gibi sh thsitemap.shbir hata alıyorum ve boş bir sitemap.xml dosyası oluşturur:

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

Ancak, rootbu satırları el ile kopyalayıp terminale yapıştırdığımda aynı kullanıcı olarak, herhangi bir hata olmadan çalışır ve sitemap.xml dosyası tüm URL'lere sahiptir. Sorun ne? Bunu nasıl düzeltebilirim?

#!/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

Senaryoyu nasıl çalıştırıyorsunuz?
cuonglm

@Gnouc sh script.sh
THpubs

8
Deneyin:, bash script.shçağrı shyapmak bashiçin posix moduna geçin. Bu tür soruların cevaplandığını hatırlıyorum. Şuna
cuonglm

Yanıtlar:


35

Komut dosyasını şu şekilde çalıştırın:

bash script.sh

ya da sadece:

./script.sh

Bu bashad kullanılarak çalıştırıldığında sh, [[test operatörü gibi uzantılarının çoğunu devre dışı bırakır .

#!/bin/bashMesele hattına sahip olduğunuzdan, kabuk yorumlayıcısını komut satırında açıkça belirtmeniz gerekmez. Komut dosyasını komut olarak çalıştırmak, kabuğu bulmak için bu satırı kullanır.


-1

Her ikisi de ... if [[ debug = "...“ ]] ; then...komutlarınız yanlış olmalılar ...

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

6
Hayır, kod geçerli bash, sadece geçerli değil sh.
glenn jackman

Hata 1, satır 22 [[ile ilgili bazı sorunlar.
rhubarbdog

@rhubarbdog dosya # varsa # / bin / sh o zaman cevap çalışabilir, / bin / bash ise eğer [[debug =" ...“]] olmamalı bir sorun!
Rajesh Hatwar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.