टिल्ड का उपयोग मेरे होम डायरेक्टरी के शॉर्टकट के रूप में कैसे किया जाता है?


30

मैं उलझन में था, कुछ फाइलों को एक पीसी से दूसरे में कॉपी करने की कोशिश कर रहा था। मैंने इसे समझ लिया है, लेकिन सिंटैक्स अभी भी मुझे भ्रमित कर रहा है। यह काम:

scp ~/Desktop/Volenteer.png jay@server.ip:~j0h/b

जो Volenteer.pngफ़ोल्डर में डालता है /home/j0h/b। हालाँकि, यह काम नहीं करता है:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

यह भी विफल रहता है, बाहर निकलने की स्थिति 1 फ़ाइल नहीं मिली:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

जैसा कि यह है:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

तो स्पष्ट रूप से, कुछ अंतर है ~और ~/ यह अंतर की उपस्थिति है/

$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory

तो scp में क्यों, ~करने का संकल्प करता है ~/? यह एक अनुमान है, मैं यह सत्यापित नहीं कर सकता कि क्या हो रहा है। लेकिन यह असंगत लगता है, और इसलिए भ्रामक है। क्या यह scp में बग है? या क्या मुझे याद आ रही टिल्ड के बारे में कुछ है?


2
बस एक ओर ध्यान दें, यह "ई" :) के बजाय "यू" के साथ "स्वयंसेवक" वर्तनी है:
AER

2
मैं एक उदार स्पेलर हूं।
j0h

जवाबों:


68

~ अपने घर निर्देशिका है।

~fooउपयोगकर्ता की होम निर्देशिका है foo, यदि ऐसा उपयोगकर्ता मौजूद है, या केवल एक निर्देशिका नाम है ~foo, यदि वह उपयोगकर्ता मौजूद नहीं है।


इसलिए, इसमें:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

~Desktopउपयोगकर्ता की होम निर्देशिका में विस्तार होगा Desktop, अगर ऐसा उपयोगकर्ता मौजूद है (और यह आमतौर पर नहीं होता है), या बस हो ~Desktop(एक पथ जो आमतौर पर या तो मौजूद नहीं है)।


में:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

~/j0hनाम के एक निर्देशिका करने के लिए विस्तार होगा j0hमें jayघर निर्देशिका है, जो, फिर से, अस्तित्व के लिए संभावना नहीं है।


ऐसा नहीं है ~और ~/जहां अंतर होता है, लेकिन इसमें ~और ~foo


इसके अतिरिक्त, ~निर्देशिका इतिहास नेविगेशन के लिए भी इस्तेमाल किया जा सकता है:

  • ~-पिछली कार्यशील निर्देशिका है (जैसे $OLDPWD)
  • ~+वर्तमान कार्यशील निर्देशिका है (जैसे $PWD)

यह लागू नहीं है scp, क्योंकि आपको किसी scpऑपरेशन के बीच में निर्देशिकाओं को बदलने की आवश्यकता नहीं है ।

और यदि आप एक निर्देशिका स्टैक का उपयोग करते हैं pushdऔरpopd बनाए रखते हैं, और निर्देशिका स्टैक में वें निर्देशिका होगी , जैसा कि आउटपुट में देखा गया है । अंत से वें निर्देशिका होगी (दोनों मामलों में शून्य से गिनती)। उदाहरण के लिए:~N~+NNdirs~-NN

$ for i in etc usr var tmp; do pushd /$i; done
/etc ~/.vim
/usr /etc ~/.vim
/var /usr /etc ~/.vim
/tmp /var /usr /etc ~/.vim

$ dirs
/tmp /var /usr /etc ~/.vim

फिर, स्टैक में निर्देशिकाओं का उपयोग करके पहुँचा जा सकता है:

/tmp /var /usr /etc ~/.vim
  ~0   ~1   ~2   ~3     ~4
 ~+0  ~+1  ~+2  ~+3    ~+4
 ~-4  ~-3  ~-2  ~-1    ~-0 
  ~+   ~-

तो, ~+हमेशा के बराबर है ., तो क्या यह सही है? बेमानी लगता है।
वाइल्डकार्ड

1
@Wildcard अच्छी तरह से, बिल्कुल नहीं। ~+और ~-के मूल्यों का उपयोग $PWDऔर $OLDPWDहै, जो पूर्ण रास्ते हैं। .हमेशा एक सापेक्ष मार्ग है। इसलिए, यदि कोई ऐसी कमांड है जो निष्पादित करते समय वर्तमान कार्य निर्देशिका को बदल देती है, तो इसके लिए नया पथ दिखाई देगा ., जहां द्वारा विस्तारित पथ ~-समान रहेगा। tar -Cएक उदाहरण है, हालांकि मैं मानता हूं कि मैं इसके लिए एक अच्छे उपयोग के बारे में नहीं सोच सकता ~+$PWDसिर्फ अच्छे के रूप में हो सकता है, सिवाय इसके कि आप उद्धृत करने के लिए की जरूरत नहीं है ~+/foo/barअगर $PWDस्पेस हैं।
मुरु

1
धन्यवाद, जो इसे स्पष्ट करता है। वास्तव में यह एक अच्छा उदाहरण है कि मामला सही है: सुरक्षा कारणों से कुछ रास्तों को संचालित करने से मना कर दिया जाता है; इस तरह के आदेशों के साथ आप उपयोग नहीं कर सकते हैं, ./filenameलेकिन "$PWD/filename"अधिक या बस का उपयोग कर सकते हैं ~+/filename। (और कुछ कमांड रिश्तेदार पथनामों पर काम करेंगे, लेकिन एक कार्यात्मक अंतर है, जैसे कि lnया tar)।
वाइल्डकार्ड

21

बश टिल्ड एक्सपेंशन के लिए GNU डॉक्यूमेंटेशन के माध्यम से पढ़ें (जैसा कि मुझे इस उत्तर के पहले पुनरावृत्ति से पहले होना चाहिए)।

~/Desktopऔर ~j0hमौलिक रूप से अलग-अलग काम कर रहे हैं, जो बताते हैं कि ~Desktopकाम क्यों नहीं करता है:

  • लॉगिन पर सेट ~आपके वर्तमान $HOMEपर्यावरण चर के लिए एक सादा प्रतिस्थापित किया जाता है । तो मेरे लिए ~हल है /home/oli, और के ~/Desktopरूप में पढ़ता है /home/oli/Desktop। यह वह जगह है जहाँ आप टिल्डा को सबसे अधिक इस्तेमाल करते हुए देखते हैं।

  • ~usernameउस उपयोगकर्ता के घर का समाधान करता है, जिसमें सेट किया गया है /etc/passwd। तो ~oliहल करने के लिए /home/oli, लेकिन ~j0hहल करने के लिए /home/j0hशायद नहीं, अपने homedir कहीं भी हो सकता है।

  • ~not-a-usernameहल नहीं करता है। क्योंकि Desktopउपयोगकर्ता नहीं है, ~Desktopप्रतिस्थापित नहीं है। इसे सचमुच एक फ़ाइल या पथ के रूप में लिया जाता है जिसका नाम ~Desktop(जो यहां मौजूद नहीं है)।

और कहने की जरूरत नहीं है, यह सब दूर से हो रहा है ( scpयदि यह स्थानीय मूल्यों के साथ बदल दिया गया तो बेकार होगा )। यह काम करता है क्योंकि बैश स्थानापन्न नहीं होगा ~...अगर यह किसी भी चीज से पहले हो लेकिन व्हाट्सएप।


क्या getent passwd binकहता है?
मूरू

2
"बिन" अधिकांश लिनक्स मशीनों पर एक सिस्टम उपयोगकर्ता है, जिसमें होम निर्देशिका / बिन है।
fNek

1
विस्तार ~dirमें विफलता ग्नू डॉक्स के अनुरूप है: "... टिल्ड के बाद टिल्ड-प्रीफ़िक्स के पात्रों को एक संभावित लॉगिन नाम के रूप में माना जाता है ... यदि लॉगिन नाम अमान्य है, या टिल्ड विस्तार विफल हो जाता है, तो शब्द अपरिवर्तित रह गया है। " यहां, dirइस सिस्टम पर एक उपयोगकर्ता का नाम नहीं है, इसलिए इसे अपरिवर्तित छोड़ दिया जाता है।
अप्सिलर्स

सबको शुक्रीया। मैं शायद चाहिए पढ़ा लिंक मैं पोस्ट :)
ओली

4

प्रतीक ~के लिए एक शॉर्टकट के रूप में इस्तेमाल किया जाता है /home/userमें bashकी तो मामले में, ~/Desktop/Volenteer.pngयह के लिए आशुलिपि है /home/user/Desktop/Volenteer.png

तो जैसा कि आप देख सकते हैं /, हमेशा की तरह, फ़ाइल सिस्टम पदानुक्रम में एक नया स्तर दिखाता है।


3
केवल आधा सही है, $ HOME पर्यावरण चर के लिए एक आशुलिपि। ~{user}/पासवार्ड (5) डेटाबेस फ़ाइल द्वारा निर्धारित बस के रूप में कोई भी यादृच्छिक पथ हो सकता है। हां, जबकि filesytem.org मानकों को नियमित उपयोगकर्ता / घर में रखते हैं, ऐसा हर उपयोगकर्ता (यानी रूट / इन / रूट और / var / ... या पुराने यूनिक्स के साथ / घर के बजाय usries) में नहीं होता है।
ड्वाइट स्पेंसर

ड्वाइटस्पीकर सही है। मैं कई सर्वरों को बनाए रखता हूं जहां उपयोगकर्ता / usr / {CLIENTNAME} / home / हैं और कई इनडोर और रिमोट सिस्टम (उस निर्देशिका के सभी बिंदु) पर साझा किए जाते हैं, इसलिए केवल 1 सिस्टम को बनाए रखने की आवश्यकता है। और ~ उस निर्देशिका को इंगित करता है;)
रिनजविंड

3
@Rinzwind eek मुझे इस पवित्र दुरुपयोग का विरोध करना चाहिए /usr
मुरु

@ मूरू अरे यह मेरा फोन नहीं था>: - D यह SCO D से बायीं तरफ था:
Rinzwind

1
ईमानदारी से मुझे सभी चीजों के उपयोगकर्ता / usr का उपयोग पसंद आया क्योंकि यह मूल रूप से था। इन दिनों मुझे जो पता चलता है वह आधार बिनुटिल्स के बाहर सभी बायनेरिज़ (साइज़, उपयोगकर्ता, सिसोप) के भव्य एकीकृत डंपिंग ग्राउंड के रूप में / usr / बिन का अधिक पवित्र दुरुपयोग है। के बाद सभी / usr का मतलब था क्योंकि सभी चीजों के लिए उपयोगकर्ताओं के पास nfs माउंट से खींचने की पहुंच होती है, जबकि / usr / स्थानीय sysop binaries और / bin system binaries के रूप में / sbin के साथ स्थानीय उपयोगकर्ता स्थान था। मुझे लगता है कि / घर एक अलग विभाजन हो सकता है, लेकिन इसलिए / usr / home / ... इसे / usr में रखकर इसे उपयोगकर्ता नामस्थान के रूप में नीति, कार्यान्वयन और मानसिकता दोनों में रखता है।
ड्वाइट स्पेंसर

3

~ पर्यावरण चर के लिए आशुलिपि है $HOME सबसे अधिक सी शेल व्युत्पन्न / समर्थन POSIX अनुरूप गोले पर। ~अपने स्वयं के घर निर्देशिका या किसी अन्य उपयोगकर्ता के घर को संदर्भित करते समय सबसे आम उपयोग है:

cd ~ # ie shell, take me to my home folder

cd ~root # i.e. shell, take me to root's home folder

किसी POSIX सिस्टम (UNIX, Linux, OS X, BSD) पर किसी भी स्थानीय उपयोगकर्ता के लिए होम निर्देशिका खोजने के लिए जो passwd (5) डेटाबेस रन awk का उपयोग कर रहा है/etc/passwd जैसे:

awk -F: '{ print $1,$(NF-1) }' /etc/passwd

यह प्रत्येक स्थानीय उपयोगकर्ता और उनके होम डायरेक्टरी को सूचीबद्ध करेगा।

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