एक और शॉर्टकट बनाएं ~ ~ ~ `की तरह` ~ (घर निर्देशिका)


10

मैं ~~एक अलग निर्देशिका को इंगित करना चाहता हूं ताकि मैं इसे शॉर्टकट के रूप में उपयोग कर सकूं। मैं चाहता हूं कि इसमें ठीक वैसा ही कार्य हो ~। मैं यह कैसे कर सकता हूँ?


2
आप के साथ बंद बेहतर हो सकता है zsh नामित निर्देशिका
माइकल Mrozek

बस समस्या का एक दिलचस्प समाधान
ढूंढा गया

1
@VarunAgw हाहा, मजेदार लगता है, ठीक है जैसा कि मैंने उसी समाधान के बारे में सोचा था। शर्म की बात है। मुझे लगा कि मैं एक मिनट के लिए एक अद्वितीय तितली था :(
ग्रेवी

जवाबों:


14

वास्तव में, एक रास्ता है, यह एक शानदार तरीका नहीं है, लेकिन यह एक तरीका है, हाहा!

अपनी /etc/passwdफ़ाइल में निम्न जोड़ें :

~:x:1111:99:special Character user:/test:/sbin/nologin

1111UID को उस चीज़ के साथ बदलें जो कुछ समझ में आता है, /testउस निर्देशिका से बदलें जिसे आप चाहते हैं ~ ~ की नकल करें।

99मेरे सिस्टम पर वह nobodyसमूह है जिसकी मैं अनुशंसा करता हूं यदि आप यह सुनिश्चित करने के लिए ऐसा करते हैं कि यह किसी भी फाइल पर NO अनुमतियों वाला एक समूह है जो कभी भी उपयोग किया जाएगा। सैद्धांतिक /sbin/nologinरूप से शेल के रूप में, इसका उपयोग करने में सक्षम नहीं होना चाहिए, इसमें /etc/shadowप्रविष्टि भी नहीं होगी, इसलिए इसमें पासवर्ड नहीं होगा। सैद्धांतिक रूप से ठीक होना चाहिए, लेकिन सुनिश्चित करें कि यह किसी भी तरह से आपको खाते के रूप में लॉग इन नहीं करने देता है।

एक साइड नोट के रूप में: मैं किसी भी तरह से यह नहीं कह रहा हूं कि यह एक अच्छा विचार है, लेकिन यह उस कार्यक्षमता को पूरा करेगा जो आप चाहते हैं।

संपादित करें: पूर्णता 'खातिर इस VarunAgw द्वारा सुझाव दिया गया था: आप के साथ सामान्य रूप में उपयोगकर्ता जोड़ सकता है useradd -s /sbin/nologin -N tmpऔर उसके बाद संशोधित /etc/passwdऔर /etc/shadowउपयोगकर्ता को बदलने के लिए tmpकरने के लिए ~और का स्थान बदलने केhome directory


इसके बजाय यूआईडी और GID बदलने की है, हम बस कर सकते हैं useradd 'tmp'और उसके बाद की जगह tmpके साथ~
VarunAgw

सच। अच्छा सुझाव। मैं अनिश्चित हूं कि मैं इसे एक shadowप्रविष्टि के साथ वैध बनाने के बारे में कैसा महसूस करता हूं, लेकिन मुझे लगता है कि जब तक कोई पासवर्ड सेट नहीं होता है तब तक यह वास्तव में एक अतिरिक्त जोखिम नहीं है।
ग्रेवी सिप

8

आप CDPATH का उपयोग कर सकते हैं और ~~ अपनी CDPATH घटकों में से एक में शाब्दिक रूप से नामित निर्देशिका रख सकते हैं ।

से man bash(लेकिन CDPATH में भी उपलब्ध है sh)

सीडी कमांड के लिए खोज पथ। यह निर्देशिकाओं की एक बृहदान्त्र-अलग-अलग सूची है जिसमें शेल सीडी कमांड द्वारा निर्दिष्ट गंतव्य निर्देशिकाओं के लिए दिखता है। एक नमूना मूल्य "है ।: ~: / usr"।

जो आपको करने की अनुमति देगा cd ~~

यदि आप vi ~~/someFileनिर्देशिका ट्री में कहीं से भी चीजें करना चाहते हैं , तो आप भाग्य से बाहर हैं यदि आप ~~शाब्दिक रूप से जोर देते हैं जब तक कि आप अपने शेल को हैक नहीं करते हैं, हालांकि, आप अपनी जादुई निर्देशिकाओं को संग्रहीत करने के लिए चर या पर्यावरण चर का उपयोग कर सकते हैं ताकि आप कर सकें। , जैसे,$tilda/someFile

मैं आमतौर पर अपने घर निर्देशिका में शीघ्र ही नामित निर्देशिकाओं के अंदर अक्सर एक्सेस की गई फ़ाइलों को डाल देता हूं ताकि मैं उन्हें इस तरह ~/bया जैसे पथों के साथ एक्सेस कर सकूं ~/l

स्वाभाविक रूप से, आप आमतौर पर निर्देशिकाओं को सहानुभूति के साथ निर्देशिकाओं में बदल सकते हैं जितना आप चाहते हैं।


1

शेल का ~टिल्ड विस्तार ज्यादातर प्रोग्रामेबल है। यह या तो अपने अनुगामी संदर्भ में घोषित सिस्टम उपयोगकर्ता नाम की उपयोगकर्ता निर्देशिका में फैलता है (और इन पंक्तियों के साथ एक उत्कृष्ट समाधान पहले से ही पेश किया गया है) , $HOMEशेल चर का मूल्य , या बिल्कुल भी नहीं।

इसलिए:

(HOME=/tmp; cd ~)
pwd; echo "$HOME"

/tmp
/home/mikeserv

मैं $HOMEहर समय बदलता हूं , और मैं इसे रीसेट करने के लिए अपने शेल के पर्यावरण फ़ाइल में एक फ़ंक्शन रखता हूं:

home(){
    HOME=~$USER
    cd ~; pwd
}

यदि आप ~किसी तरह से टिल्ड का उपयोग करना चाहते हैं जो आपके होम डायरेक्टरी को संदर्भित नहीं करता है, तो ऐसा करें । बस फिर से भरोसा $HOME। इससे डरो मत। $HOMEकिसी भी अन्य की तरह सिर्फ एक शेल चर है।


मेरे पास एक और सुझाव है कि @ PSkocik के उपयोग के बारे में उत्कृष्ट सलाह पर केवल थोड़ा विस्तार है $CDPATH। एक बात जिसका उन्होंने उल्लेख नहीं किया, वह यह है कि आप $CDPATHवर्तमान शेल मूल्य $CDPATHको बिल्कुल भी बदले बिना इनलाइन का उपयोग और परिवर्तन कर सकते हैं । उदाहरण के लिए:

mkdir -p /tmp/1/2
CDPATH=/tmp cd 1/2

/tmp/1/2

cdयह आवश्यक रूप से एक शेल बिलिन है, लेकिन यह एक POSIX विशेष शेल बिलिन नहीं है, और इसलिए इसके मूल्य को घोषित करने से $CDPATHइसका शेल शेल मूल्य प्रभावित नहीं होता है। यदि आप इसका उपयोग करते हैं जैसा कि मैंने ऊपर किया $CDPATHहै तो केवल एक cdकमांड के पर्यावरण के लिए बदल दिया गया है , और इसके पिछले मूल्य को इसके बाद से बहाल किया गया है। इतिहास पूरा होने के साथ संयोजन में उपयोग किए जाने पर मुझे उपरोक्त तकनीक सबसे उपयोगी लगती है। मैं उपरोक्त कार्य करूंगा, एक निर्देशिका में बदलूंगा, कुछ कमांड चलाऊंगा, तब तक cdदबाऊंगा जब तक कि मैं अपनी कमांड पर वापस नहीं आता और एक पथ खंड या दो को अन्यत्र स्थानांतरित करने के लिए बैकस्पेस देता हूं ।


अब यदि आप इन दोनों अवधारणाओं को जोड़ते हैं तो आप अगली बार इस्तेमाल किए जाने वाले कमांड का मतलब पूरी तरह से अलग कर सकते हैं जब आप इसे इस्तेमाल करते हैं।

for HOME in /tmp ~
do  mkdir -p ~/1/2
    CDPATH=~ cd 1/2
done

/tmp/1/2
/home/mikeserv/1/2

0

पूरी तरह से एक काम करता है के रूप में अच्छी तरह से काम करता है:

$ function ~~ { cd /tmp; }
$ pwd
/home/jackman
$ ~~
$ pwd
/tmp
$ cd -
$ pwd
/home/jackman

यहाँ एक और दृष्टिकोण है जो थोड़ा करीब आता है (मुझे पता है कि मैं आवश्यकताओं के करीब नहीं जा रहा हूँ)

function ~~ { echo /test; }

फिर कुछ और पात्रों के साथ:

cd `~~`/subdir
vi `~~`/file

2
खैर, cd ~~/foo/barइतनी अच्छी तरह से काम करने के लिए जा नहीं है, या vim ~~/foo.txt, आदि ...
derobert

1
सवाल अस्पष्ट है। यदि यह वांछित उपयोग है, तो मैं मामले CDPATHको संभालने के लिए चर का उपयोग करूंगा cd
ग्लेन जैकमैन 20

सहमत यह पूरी तरह से स्पष्ट नहीं है, लेकिन ओपी इसे काम करने के लिए कहता है ~। और ~एक कमांड की तरह उपयोग नहीं किया जाता है।
derobert

मुझे यह पूरी तरह से समझ में आता है, अगर पूरी तरह से वर्तनी नहीं है। इसके साथ समस्या CDPATHयह है कि .... सीडी के बाहर के कमांड के लिए काम नहीं करता है। IE आप cd ~~या कर सकते हैं, cd ~~/testdir1लेकिन आप नहीं कर सकते हैंvim ~~testdir1
ग्रेवी

आप किसी फ़ंक्शन को कॉल करने वाले उपनाम के साथ बेहतर कर सकते हैं। जैसेalias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeserv
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.