लिनक्स श स्क्रिप्ट फेंकता है "#! / बिन / श: नहीं मिला"


1

मेरे पास एक स्क्रिप्ट है

#!/bin/sh

# Automatically remove a torrent and delete its data after a specified period of
# time (in seconds).

TARGET=/var/www/transmission/completed
USER=name
PASS=pass
BIN="/usr/bin/transmission-remote"

# The default is 5 minutes (in seconds).
CUTOFF=`expr 100 \* 3`

##############################################
### You shouldn't need to edit below here. ###
##############################################

# Tokenise over newlines instead of spaces.
OLDIFS=$IFS
IFS="
"

for ENTRY in `$BIN -n $USER:$PASS -l | grep 100%.*Done.*Finished`; do

    # Pull the ID out of the listing.
    ID=`echo $ENTRY | sed "s/^ *//g" | sed "s/ *100%.*//g"`

    # Determine the name of the downloaded file/folder.
    NAME=`$BIN -n $USER:$PASS -t $ID -f | head -1 |\
         sed "s/ ([0-9]\+ files)://g"`

    # If it's a folder, find the last modified file and its modification time.
    if [ -d "$TARGET/$NAME" ]; then
        LASTMODIFIED=0
        for FILE in `find $TARGET/$NAME`; do
             AGE=`stat "$FILE" -c%Y`
             if [ $AGE -gt $LASTMODIFIED ]; then
                 LASTMODIFIED=$AGE
             fi
        done

    # Otherwise, just get the modified time.
    else
        LASTMODIFIED=`stat "$TARGET/$NAME" -c%Y`
    fi

    TIME=`date +%s`
    DIFF=`expr $TIME - $LASTMODIFIED`

    # Remove the torrent if its older than the CUTOFF.
    if [ $DIFF -gt $CUTOFF ]; then
        date
        echo "Removing $NAME with ID:$ID"
        $BIN -n $USER:$PASS -t $ID --remove-and-delete
    fi

done

IFS=$OLDIFS

लेकिन जब मैं इसे चलाने की कोशिश करता हूं तो मुझे यह त्रुटि मिलती है: /root/transmission_r.sh: 1: /root/transmission_r.sh: #! / bin / sh: नहीं मिला है


... तो, क्या करता है ls /bin/sh आपको देना?
Arjan

यह मुझे देता है: / बिन / श
Nojus741

1
उस पहली पंक्ति पर कोई मज़ेदार पात्र तब?
Arjan


4
आह, यह मिल गया, फ़ाइल एन्कोडिंग UTF-8 के लिए सेट किया गया था, मैंने इसे बिना BOM के सेट किया और यह अब काम करता है।
Nojus741

जवाबों:


10

आपकी स्क्रिप्ट के साथ शुरू होता है:

#!/bin/sh

यह एक टिप्पणी नहीं है, लेकिन ए कुटिया उपयोग करने के लिए अपने ऑपरेटिंग सिस्टम को बताने के लिए /bin/sh स्क्रिप्ट निष्पादित करने के लिए। लेकिन स्पष्ट रूप से उबंटू इसे नहीं पा सकता है।

  • अगर ls /bin/sh कोई परिणाम नहीं दिखाता है, फिर मुझे लगता है कि इसे ठीक करने की आवश्यकता है। एक अस्थायी समाधान के रूप में, आप भाग्यशाली हो सकते हैं कि आपकी स्क्रिप्ट भी काम करती है, उदाहरण के लिए, बैश:

    #!/bin/bash
    
  • अगर /bin/sh कर देता है मौजूद (जैसे यह होना चाहिए), फिर किसी तरह उबंटू उस पहली पंक्ति की व्याख्या नहीं कर सकता। इसे हेक्स के रूप में डंप करें:

    head -n 1 myscript.sh | hexdump -C
    
    00000000  ef bb bf 23 21 2f 62 69  6e 2f 73 68 0d 0a        |...#!/bin/sh..|
    

    और परिणाम के साथ:

    • सुनिश्चित करें कि लाइन अंत यूनिक्स प्रारूप का उपयोग कर रहे हैं, LF ( \n या हेक्साडेसिमल 0a ) के बजाय, उदाहरण के लिए, विंडोज मानक CRLF ( \r\n या हेक्साडेसिमल 0d0a ऊपर के उदाहरण में)। मैक पर यह वास्तव में एक अलग त्रुटि फेंक देगा:

      /bin/sh^M: bad interpreter: No such file or directory
      
    • सुनिश्चित करें कि फ़ाइल एन्कोडिंग गड़बड़ न करें, जैसे कि (अदृश्य) यूनिकोड बीओएम ( ef bb bf ऊपर के उदाहरण आउटपुट में)। उपर्युक्त उदाहरण में आपका शेल एक टिप्पणी या शेलबैंग नहीं देख रहा है, लेकिन एक कमांड चलाने की कोशिश कर रहा है जो 3 अदृश्य पात्रों से शुरू होता है। इस स्थिति में आपका शेल संभवतः अगली पंक्तियों को निष्पादित करेगा, या स्क्रिप्ट को सफलतापूर्वक पूरा भी कर सकता है। एक मैक पर पहली पंक्ति वास्तव में फेंकता है:

      ./myscript.sh: line 1: #!/bin/sh: No such file or directory
      

उस संदेश में अदृश्य पात्रों को देखने के लिए त्रुटि संदेश को डंप करने के लिए, त्रुटि आउटपुट को मानक आउटपुट पर पुनर्निर्देशित करने की आवश्यकता है:

./myscript.sh 2>&1 | hexdump -C

00000000  2e 2f 6d 79 73 63 72 69  70 74 2e 73 68 3a 20 6c  |./myscript.sh: l|
00000010  69 6e 65 20 31 3a 20 ef  bb bf 23 21 2f 62 69 6e  |ine 1: ...#!/bin|
00000020  2f 73 68 3a 20 4e 6f 20  73 75 63 68 20 66 69 6c  |/sh: No such fil|
00000030  65 20 6f 72 20 64 69 72  65 63 74 6f 72 79 0a     |e or directory.|

ट्रांसमिशन_आर.श: १: ट्रांसमिशन_आर.श: #! / बिन / बाश: नहीं मिला
Nojus741

1
इसे निकालने के लिए, इसे vi में खोलें और एक ": सेट्लोकल नोबॉम्ब" करें
ndrix
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.