मैं इसके लिए अपने आप को अनुमति (साथ chmod u+x
) दिए बिना किसी फ़ाइल को कैसे निष्पादित कर सकता हूं ?
अगर मैं 'एक्ज़क्यूटिंग फ़ाइल को प्रोग्राम के रूप में अनुमति देता हूँ' चेकमार्क टिक करता हूँ, तो चेकमार्क तुरंत हटा दिया जाता है।
मैं इसके लिए अपने आप को अनुमति (साथ chmod u+x
) दिए बिना किसी फ़ाइल को कैसे निष्पादित कर सकता हूं ?
अगर मैं 'एक्ज़क्यूटिंग फ़ाइल को प्रोग्राम के रूप में अनुमति देता हूँ' चेकमार्क टिक करता हूँ, तो चेकमार्क तुरंत हटा दिया जाता है।
जवाबों:
कृपया आगे कुछ भी करने से पहले (जब तक आप सुनिश्चित न हों कि आप फ़ाइल के स्वामी हैं)।
जाँच करें और सुनिश्चित करें कि आप उस फ़ाइल के मालिक हैं जिसे आप निम्नलिखित विधियों में से किसी एक के साथ निष्पादित करने का प्रयास कर रहे हैं।
इस आदेश को किसी टर्मिनल में निष्पादित करें
[ ! -O "/path/to/file" ] && echo "You don't own the file"
You don't own the file
" प्रिंट करता है , तो नीचे "फ़ाइल स्वामित्व बदलें" देखें।इस आदेश को किसी टर्मिनल में निष्पादित करें
sudo chown $USER:$(id -gn $USER) "/path/to/file"
एक जवाब मैं एक से मिला टिप्पणी द्वारा Lekensteyn एक पर जवाब एक के लिए प्रश्न के बारे में chmod
NTFS विभाजन जो मुझे लगता है कि उसके अपने सवाल-जवाब, Lekensteyn के लिए पूरा श्रेय पर।
निष्पादन योग्य फ़ाइलों के लिए इस कमांड का उपयोग करें ( /path/to/executable
सही पथ के साथ प्रतिस्थापन ):
64 बिट निष्पादन योग्य फाइलें:
/lib64/ld-linux-x86-64.so.2 /path/to/executable
32 बिट निष्पादन योग्य फाइलें:
/lib/ld-linux.so.2 /path/to/executable
यदि उपरोक्त काम नहीं करता है (या फ़ाइल नहीं मिली त्रुटियों को उठाता है), तो उपरोक्त कमांड से पहले इसका उपयोग करने का प्रयास करें
cd "$(dirname /path/to/executable)"
उपरोक्त सभी कमांड पाठ आधारित स्क्रिप्ट (बाश, पायथन, पर्ल, आदि) के लिए काम नहीं करेंगे , नीचे देखें।
इस कमांड का उपयोग यह पता लगाने के लिए करें कि एक निष्पादन योग्य 32 ( x86
) या 64 ( x86-64
) बिट है
objdump -f "$file" | grep '^architecture' | cut -d, -f1 | sed 's/architecture: //'
अगर यह कहता है i386:x86-64
, तो यह 64 बिट है। यदि यह i386
केवल कहता है , तो यह 32 बिट है।
पाठ आधारित स्क्रिप्ट (बाश, पायथन, पर्ल, आदि) के लिए, आपको #!
फ़ाइल में पहली पंक्ति में निर्दिष्ट कमांड का उपयोग करना चाहिए ।
उदाहरण के लिए, यदि फ़ाइल की पहली पंक्ति है
#!/usr/bin/env python3
फिर इन कमांड को टर्मिनल में चलाएं ( /path/to/file
सही रास्ते से प्रतिस्थापित )
cd "$(dirname /path/to/file)" # Not strictly necessary, see section below
# Replace '/usr/bin/env python3' with the first line without the front #!
/usr/bin/env python3 /path/to/file # Use './file' if you want
.jar
फाइलेंजावा निष्पादन योग्य जार के लिए, आप बस इन कमांड का उपयोग कर सकते हैं ( /path/to/jar
सही पथ के साथ प्रतिस्थापन ):
cd "$(dirname /path/to/jar)" # Not strictly necessary, see section below
java -jar /path/to/jar
cd "$(dirname /path/to/file)"
ये संभव परिस्थितियां हैं जहां आपको cd "$(dirname /path/to/file)"
किसी भी विधि के साथ कार्यक्रम चलाने से पहले उपयोग करने की आवश्यकता नहीं है: यदि कम से कम एक सच है, तो आपको cd
पहले की आवश्यकता नहीं होगी ।
apt-get
)cd
(या समतुल्य) किसी भी फाइल संचालन करने से पहले एक पूर्ण पथ के लिए बदलने के लिए (उदाहरण: cd "$(dirname "$0")"
)./
कोई स्लैश के साथ शुरू या शुरू होने वाले पथ) का संदर्भ नहीं देता हैयदि अनिश्चित है, cd "$(dirname "$0")"
तो स्क्रिप्ट के शीर्ष पर (या समतुल्य) जोड़ें (यदि लागू हो) या cd "$(dirname /path/to/file)"
वैसे भी उपयोग करें ।
यदि यह एक शेल स्क्रिप्ट है, तो आप इसे किसी अन्य शेल स्क्रिप्ट से "स्रोत" कर सकते हैं, अर्थात:
#!/bin/bash
# This script runs another script indirectly, by sucking in its contents and evaluating inline:
source /path/to/script/which/lost/its/exec/flag "$@"
यदि आवश्यक हो तो "$ @" कमांड लाइन मापदंडों को जोड़ता है।
होने के बाद, यह शायद अंतर्निहित समस्या का सबसे अच्छा समाधान नहीं है, लेकिन हम विकल्प की पेशकश करने के लिए उस समस्या के बारे में पर्याप्त नहीं जानते हैं।
bash script $@