2009-05-03 10 views
37

में निष्पादन योग्य फ़ाइलों को बनाना एक चीज जो मैं करने की योजना बना रहा हूं वह लिखना (दर्दनाक सरल) पर्ल स्क्रिप्ट है, और मैं टर्मिनल से स्पष्ट रूप से पर्ल को कॉल किए बिना उन्हें चलाने में सक्षम होना चाहता हूं। मैं इसकी सराहना करता हूं, ऐसा करने के लिए, मुझे उन्हें अनुमतियां निष्पादित करने की आवश्यकता है। Chmod के साथ ऐसा करना काफी आसान है, लेकिन यह थोड़ा श्रमिक अतिरिक्त कदम की तरह लगता है। मुझे क्या चाहिए दो चीजों में से एक है:लिनक्स

सबसे पहले, फ़ाइल सहेजते समय निष्पादित ध्वज सेट करने का कोई तरीका है? वर्तमान में मैं जीएडिट और गेनी के साथ प्रयोग कर रहा हूं, लेकिन अगर यह क्षमता थी तो एक समान- (या बेहतर-) फीचर्ड एडिटर पर स्विच करने के लिए तैयार रहेंगे।

यह विफल होने का कोई तरीका है कि किसी विशेष निर्देशिका में बनाई गई सभी फ़ाइलों को निष्पादित अनुमतियां होनी चाहिए?

मेरा उमास्क 022 पर सेट है, जहां तक ​​मैं समझता हूं, ठीक है, लेकिन ऐसा लगता है कि फ़ाइलों को निष्पादन योग्य फ़ाइलों के बजाय टेक्स्ट फ़ाइलों (666 डिफ़ॉल्ट अनुमतियों के साथ) के रूप में बनाया गया है (777 डिफ़ॉल्ट अनुमतियों के साथ) ।

शायद मैं आलसी हूं, लेकिन मुझे लगता है कि हर एक स्क्रिप्ट को बनाने के लिए एक और सुविधाजनक तरीका होना चाहिए।

+0

आपको प्रत्येक फ़ाइल के आउटपुट को मुद्रित करना होगा। आपको प्रत्येक फाइल के सही पुस्तकालयों को आयात करना होगा। यह प्रोग्रामिंग की प्रक्रिया में एक और कदम की तरह लगता है, और एक जो छेड़छाड़ करने के लिए खतरनाक है। – JFA

उत्तर

2

यह वास्तव में एक सौदा का बड़ा नहीं है। आप केवल एक कमांड के साथ एक स्क्रिप्ट बना सकते हैं:

chmod a+x *.pl 

और एक पर्ल फ़ाइल बनाने के बाद स्क्रिप्ट चलाएं।

touch filename.pl && chmod a+x filename.pl && vi filename.pl # choose your favorite editor 
+0

मैं जीयूआई में सब कुछ करने का एक तरीका ढूंढ रहा था, लेकिन शायद यह संभव नहीं है। क्या यह एक सुरक्षा बात है? –

+0

हाँ, यह एक सुरक्षा बात है। यदि शेल डिफ़ॉल्ट रूप से निष्पादन योग्य सब कुछ बनाना शुरू कर देता है तो यह एक बड़ी समस्या हो सकती है। – JimB

+0

आप एक साधारण प्रोग्राम बना सकते हैं जो आपके लिए यह करता है। लेकिन ईमानदारी से, आप कुछ और करने की कोशिश नहीं करेंगे जो यूनिक्स पर्यावरण में कार्यक्रम वास्तव में करता है। – BobbyShaftoe

80

मेक फ़ाइल निष्पादन: वैकल्पिक रूप से, अगर आप इस तरह एक कमांड के साथ एक फ़ाइल खोलने सकता

chmod + x फाइल पर्ल की

ढूँढें स्थान:

जो perl

01 !

# "पथ:

यह

/bin/perl कभी कभी/usr/स्थानीय/बिन

तो में अपनी स्क्रिप्ट की पहली पंक्ति जोड़ने की तरह कुछ लौट जाना "/ उपरोक्त से पथ के साथ perl उदाहरण के लिए

#!/Bin/perl

तो फिर तुम फ़ाइल

निष्पादित कर सकते हैं ./file

वहाँ, पथ के साथ कुछ मुद्दों हो सकता है तो आप चाहते हो सकता है इसे बदलने के लिए ...

+0

धन्यवाद, लेकिन यह मेरी समस्या नहीं है। मैं पहले से ही अपनी स्क्रिप्ट को #!/Usr/bin/perl से शुरू करने की आदत में प्राप्त कर चुका हूं। एक बार जब मैंने उन्हें निष्पादन योग्य अनुमति दी है तो मैं स्क्रिप्ट ठीक कर सकता हूं; मैं बस ऐसा करने का एक आसान तरीका ढूंढ रहा था। –

+11

क्या मैं इसके बजाय '#!/Usr/bin/env perl' की सिफारिश कर सकता हूं? 'Env' प्रोग्राम मूल रूप से दिए गए तर्क को पाता है (इस मामले में," perl ") पथ पर और उसे चलाता है। यह उपयोगी है जब आप अन्य लोगों को स्क्रिप्ट भेज रहे हैं - उदाहरण के लिए, मैं मैक का उपयोग करता हूं, और पर्ल/opt/local/bin में स्थित है। –

3

जो आप वर्णन करते हैं वह इसे संभालने का सही तरीका है।

आपने कहा कि आप जीयूआई में रहना चाहते हैं। आप आमतौर पर फ़ाइल गुण मेनू के माध्यम से निष्पादन बिट सेट कर सकते हैं। यदि आप इतने इच्छुक हैं तो आप यह भी कर सकते हैं कि संदर्भ मेनू के लिए कस्टम कार्रवाई कैसे करें। यह निश्चित रूप से आपके डेस्कटॉप वातावरण पर निर्भर करता है।

यदि आप एक और अधिक उन्नत संपादक का उपयोग करते हैं, तो फ़ाइल को सहेजने पर होने वाली कार्रवाई को स्क्रिप्ट कर सकते हैं। उदाहरण के लिए (मैं केवल विम से वास्तव में परिचित हूं), आप इसे "#!/*/bin/*" निष्पादन योग्य से शुरू करने वाली कोई भी नई फ़ाइल बनाने के लिए अपने .vimrc में जोड़ सकते हैं।

au BufWritePost * if getline(1) =~ "^#!" | if getline(1) =~ "/bin/" | silent !chmod +x <afile> | endif | endif 
+0

इस टिप का उपयोग करके, मैंने यहां उल्लिखित समस्या में भाग लिया: https://bbs.archlinux.org/viewtopic.php?id=126304 तो अब मैं थोड़ा संशोधित संस्करण 'autocmd BufWritePost * का उपयोग कर रहा हूं अगर getline (1) = ~ "^ #!/बिन /" | मूक निष्पादन "! chmod a + x " | endif' – Gautam

0

मुझे लगता है कि समस्या आप में चला रहे हैं, भले ही आप प्रणाली में अपने स्वयं के umask मूल्यों को निर्धारित कर सकते हैं, इस आप स्पष्ट रूप से डिफ़ॉल्ट अनुमतियों एडिट द्वारा एक नई फ़ाइल पर सेट नियंत्रित करने की अनुमति नहीं है (या जो भी संपादक आप उपयोग करते हैं)।

मेरा मानना ​​है कि यह विवरण जीएडिट और अन्य संपादकों में हार्ड-कोड किया गया है। इसे बदलने के आपके विकल्प हैं (ए) जीएडिट के अपने स्वयं के मोड को हैक करना या (बी) एक टेक्स्ट एडिटर ढूंढना जो आपको नई फाइलों पर डिफ़ॉल्ट अनुमतियों के लिए प्राथमिकता सेट करने की अनुमति देता है। (क्षमा करें, मुझे किसी के बारे में पता नहीं है।)

इस के प्रकाश में, वास्तव में आपकी फ़ाइलों को chmod करना इतना बुरा नहीं है, है ना?

5

आपके संपादक को हैक करने या संपादकों को स्विच करने की कोई आवश्यकता नहीं है।

इसके बजाय हम आपकी विकास निर्देशिकाओं और chmod फ़ाइलों को देखने के लिए एक स्क्रिप्ट के साथ आ सकते हैं। मैंने संलग्न बैश स्क्रिप्ट में यही किया है। आप शायद टिप्पणियों के माध्यम से पढ़ना और 'कॉन्फ़िगरेशन' अनुभाग को अपनी आवश्यकताओं के अनुसार संपादित करना चाहते हैं, तो मैं इसे आपके $ HOME/bin/निर्देशिका में डालने और अपने $ HOME/.login या इसी तरह की फ़ाइल में निष्पादन जोड़ने का सुझाव दूंगा। या आप इसे टर्मिनल से चला सकते हैं।

यह स्क्रिप्ट inotifywait, जो Ubuntu पर inotify उपकरण पैकेज में आता है की आवश्यकता होती है,

sudo apt-get install inotify-tools 

सुझाव/संपादन/सुधार स्वागत है।

#!/usr/bin/env bash 

# --- usage --- # 
# Depends: 'inotifywait' available in inotify-tools on Ubuntu 
# 
# Edit the 'config' section below to reflect your working directory, WORK_DIR, 
# and your watched directories, WATCH_DIR. Each directory in WATCH_DIR will 
# be logged by inotify and this script will 'chmod +x' any new files created 
# therein. If SUBDIRS is 'TRUE' this script will watch WATCH_DIRS recursively. 
# I recommend adding this script to your $HOME/.login or similar to have it 
# run whenever you log into a shell, eg 'echo "watchdirs.sh &" >> ~/.login'. 
# This script will only allow one instance of itself to run at a time. 

# --- config --- # 

WORK_DIR="$HOME/path/to/devel" # top working directory (for cleanliness?) 
WATCH_DIRS=" \ 
    $WORK_DIR/dirA \ 
    $WORK_DIR/dirC \ 
    "       # list of directories to watch 
SUBDIRS="TRUE"     # watch subdirectories too 
NOTIFY_ARGS="-e create -q"  # watch for create events, non-verbose 


# --- script starts here --- # 
# probably don't need to edit beyond this point 

# kill all previous instances of myself 
SCRIPT="bash.*`basename $0`" 
MATCHES=`ps ax | egrep $SCRIPT | grep -v grep | awk '{print $1}' | grep -v $$` 
kill $MATCHES >& /dev/null 

# set recursive notifications (for subdirectories) 
if [ "$SUBDIRS" = "TRUE" ] ; then 
    RECURSE="-r" 
else 
    RECURSE="" 
fi 

while true ; do 
    # grab an event 
    EVENT=`inotifywait $RECURSE $NOTIFY_ARGS $WATCH_DIRS` 

    # parse the event into DIR, TAGS, FILE 
    OLDIFS=$IFS ; IFS=" " ; set -- $EVENT 
    E_DIR=$1 
    E_TAGS=$2 
    E_FILE=$3 
    IFS=$OLDIFS 

    # skip if it's not a file event or already executable (unlikely) 
    if [ ! -f "$E_DIR$E_FILE" ] || [ -x "$E_DIR$E_FILE" ] ; then 
     continue 
    fi 

    # set file executable 
    chmod +x $E_DIR$E_FILE 
done 
+0

निर्देशिका पर umask सेट करना आसान नहीं होगा? –