निर्देशिका बदलने के बिना कहीं से भी कार्यक्रम चलाएं


9

मैं एक उपनाम बनाना चाहता हूं, जो कि प्रोग्राम x को चलाता है, बिना वर्तमान निर्देशिका को बदले मैं इसमें हूं। मेरे पास अब क्या है:

alias x = "cd /home/path_to_x && ./x"

यह काम करता है, लेकिन मेरी निर्देशिका को बदल देता है। मैं जो करना चाहता हूं वह कुछ इस तरह है:

alias x="./home/path_to_x/x

लेकिन तब मुझे ऐसी कोई फ़ाइल या निर्देशिका नहीं मिलती है। किसी को भी इसके लिए एक समाधान पता है?


9
जैसे एक उपनाम सेट करें alias x='/home/path_to_x/x'.पहले का उपयोग न करें /home.(डॉट) वर्तमान निर्देशिका को संदर्भित करता है।
souravc

2
क्या xवास्तव में दौड़ने की आवश्यकता है /home/path_to_x? या आप किसी विशिष्ट निर्देशिका में रहने वाले प्रोग्राम को चलाने के बारे में अनिश्चित हैं?
आदेपन


एक और इसी तरह के सवाल askubuntu.com/questions/427818/...
c0rp

जवाबों:


13

सीडी नहीं, बस इसे अपने पूर्ण पथ का उपयोग करके चलाएं

यह संस्करण:

cd /home/path_to_x && ./x

एक निरपेक्ष पथ (आप देखते हैं कि कैसे करने के लिए निर्देशिका में परिवर्तन /home/...मूल निर्देशिका में शुरू होता है) और फिर से निष्पादन योग्य चलाता सापेक्ष पथ ./x(यह है कि, नया कार्यशील निर्देशिका के सापेक्ष)।

यह संस्करण:

./home/path_to_x/x

निष्पादन योग्य को सापेक्ष पथ पर चलाने का प्रयास करता है ./home/path_to_x/x, जिसका अर्थ है कि आपकी वर्तमान कार्यशील निर्देशिका जो भी है , उसके सापेक्ष । यह बताता है कि आपको त्रुटि क्यों मिलती है - यह सापेक्ष पथ वास्तव में मौजूद नहीं है।

आपको जो आदेश चाहिए वह होगा:

/home/path_to_x/x

निरपेक्ष पथ (रूट निर्देशिका में शुरू /) का उपयोग करके फिर से।

ओह, और आप भी केवल उपनाम बनाने के बजाय /home/path_to_xअपने को जोड़ सकते हैं PATH। देखें: पूरी राह लिखे बिना स्क्रिप्ट कैसे चलाएं?


यह प्रश्न का सही उत्तर है।
अगली सूचना तक रोक दिया गया।

1
यह केवल तभी गलत होगा जब प्रोग्राम को एक विशिष्ट निर्देशिका में चलाने की आवश्यकता हो जो इसे मिलती हैpwd
कज़ वुल्फ

@ हाहाहा सही है। /home/path_to_x/xकार्यात्मक रूप से समतुल्य नहीं है (cd /home/path_to_x && ./x); यदि यह काम करता है या नहीं, तो अनुप्रयोग निर्भर है।
रमनो

यद्यपि आप सामान्य रूप से सही हैं, इस विशिष्ट प्रश्न के लिए ओपी स्पष्ट रूप से निरपेक्ष पथ से चलने की कोशिश कर रहा था (सिर्फ एक-चरित्र गलती के साथ)। हालाँकि, मुझे यकीन है कि वे स्पष्ट कर सकते हैं कि क्या इस मामले में वर्किंग डायरेक्टरी महत्वपूर्ण है।
बेकार

8

यदि आप cdउर्फ प्रतिस्थापन के बाद छड़ी नहीं करना चाहते हैं , तो (y के साथ एक उपसमूह का उपयोग करें ):

alias my_x="(cd /home/path_to_x && ./x)&" 

आप इसे देख सकते हैं

alias test_y="(cd /tmp && sleep 10 ) & "

ध्यान दें कि समाधान

alias my_y="/home/path_to_x/x" 

बिल्कुल बराबर नहीं है। वास्तव में, यदि के माध्यम से कहा जाता है my_x, xकार्यक्रम के एक वर्तमान निर्देशिका के साथ चलाया जाता /home/path_to_x/है, जबकि अगर द्वारा कहा जाता है my_y, xएक मौजूदा निर्देशिका जो एक जहां आदेश है साथ चलाया जाता है my_yजारी किया गया था। यह महत्वपूर्ण हो सकता है या नहीं कि क्या xकर रहा है पर निर्भर करता है।

ओपी समाधान के बारे में , यह इसमें काम करता है bash:

romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null  &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano

लेकिन इसमें नहीं zsh:

[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1]  + 16744 done       ./echo A > /dev/null                                    
1& [romano:/bin] % pwd
/bin
[romano:/bin] % 

ऐसा लगता है कि बैश और zsh अलग-अलग तरीकों से सूचियों को निष्पादित करते हैं ... इसलिए स्पष्ट कोष्ठक जोड़ना बेहतर है ... धन्यवाद @EliahKagan इसे इंगित करने के लिए।


1
अनुवर्ती &उच्चता देते हुए &&ऐसा लगता है कि यह अद्वितीय हो सकता है zsh। मैंने कोशिश की sleep 5 && echo done &में zsh, bash, ksh, mksh, dash, और यहां तक कि एक गैर-बॉर्न शैली खोल ( tcsh)। केवल अग्रभूमि में zshमूल्यांकन sleep 5किया गया; अन्य सभी तुरंत लौट आए (फिर doneपांच सेकंड बाद छपे , बिल्कुल)। दूसरी ओर, भले ही यह पूरी तरह से अजीब है zsh, मुझे लगता है कि स्पष्ट ( )(या { ;}) को जोड़ना उचित है, क्योंकि यह अन्य मनुष्यों के इरादे को व्यक्त करता है (या खुद को, जब स्क्रिप्ट या इतिहास को पढ़ने के बाद)।
एलियाह कगन

4

यदि आप जिस फ़ाइल को चलाना चाहते हैं, वह पहले से ही निष्पादन योग्य है, तो आप इसे PATH चर में क्यों नहीं जोड़ते?

यदि आपकी निष्पादन योग्य फ़ाइल /home/user/aplication/appXबस दर्ज है

PATH=$PATH:/home/user/application

आपके ~/.bashrcया~/.profile

अपने कंसोल को पुनरारंभ करने के बाद, आप इसे बस के साथ चला सकते हैं appX

मुझे लगता है कि यह सबसे साफ समाधान है।


3

एक लाना &अंत में चाल करने के लिए लगता है:

alias x = "cd /home/path_to_x && ./x &"

2
क्या आपको यकीन है? अमल करने के बाद xआप अंदर हैं /home/path_to_x&अंत में बस पृष्ठभूमि में प्रक्रिया भेजें।
रमानो

2
@ रमनो यह वास्तव में काम करता है। cdपृष्ठभूमि नौकरियों में कॉल करने वाले को प्रभावित नहीं करता है (जो समझ में आता है - यह वास्तव में अजीब होगा अगर उन्होंने किया)। ऐसा इसलिए है क्योंकि अतुल्यकालिक निष्पादन एक उपधारा का उपयोग करता है । हालांकि यह बेहतर होगा अगर यह समझाया जाए कि यह क्यों काम करता है और क्या &करता है - और पृष्ठभूमि में कैसे चलना कभी-कभी अवांछनीय है - यह (पहले से ही) एक सही जवाब है। ( स्पष्ट ( )रूप से सिंटैक्स के साथ एक उपधारा बना रहे हैं , जैसा कि आप सुझाव देते हैं , हालांकि यह ज्यादातर समय का एक बेहतर समाधान है।)
एलियाह कगन

@EliahKagan आप सही हैं। मैंने इसके साथ समाधान की जाँच की zshऔर प्रभावी रूप से यह काम करता है bashऔर इसमें नहीं zsh... कुछ अंतर होना चाहिए कि कैसे एलियास का विस्तार होता है।
रमनो

एक सवाल पूछा: unix.stackexchange.com/questions/162286/…
रमनो

@Rmano आप से संबंधित सेटिंग को सक्षम किया था pushdमें zsh(मेरे पास है setopt autopushd pushdsilent pushdtohome, और यह मेरी CWD याद रखता है।)
muru

0

अपने वर्तमान pwd का बैकअप लें और अपने कमांड को चलाने के बाद अपने पिछले pwd को पूर्ववत करें।

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'

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

हाँ, हाँ सही है। @ म्योर: |
α atsнιη

ध्यान दें कि चूंकि आप दोहरे उद्धरण चिह्नों का उपयोग करते हैं , उस समय वर्तमान निर्देशिका में उपनाम शामिल होगा । जब तक उर्फ ​​का विस्तार नहीं किया जाता है तब तक मूल्यांकन को स्थगित करने के लिए एकल उद्धरण का उपयोग करें। हालाँकि, pushdऔर popdवही करें जो आपका उत्तर करता है। alias x='pushd /home/path_to_x && ./x && popd'
अगली सूचना तक रोक दिया गया।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.