टर्मिनल से उर्फ ​​कैसे जाएं?


9

उपनाम से मेरा मतलब है कि जब आप फाइंडर में किसी फ़ोल्डर पर राइट क्लिक करते हैं और "मेक एलियास" का चयन करते हैं, तो बनाए गए फ़ोल्डर शॉर्टकट। मैं के साथ टर्मिनल में प्रतीकात्मक लिंक पार कर सकते हैं cd, लेकिन यह उपनाम पर काम नहीं करता है bash: cd: example-alias: Not a directory:। क्या टर्मिनल में उपनाम के गंतव्य के लिए निर्देशिका बदलना संभव है?


मैंने अपना जवाब अपडेट किया है
markhunte

जवाबों:


5

एक फ़ोल्डर उपनाम में cd'ing को सक्षम करने के लिए मैंने मैक ओएस एक्स संकेत पर निम्नलिखित पाया है ।

निम्नलिखित कमांड के साथ नीचे स्रोत कोड संकलित करें:

gcc -o getTrueName -framework Carbon getTrueName.c

यह स्रोत के समान निर्देशिका में 'getTrueName' को क्रियान्वित करेगा। आप इसे अपने PATH में जोड़ सकते हैं, या बस इसे सीधे / usr / bin या / usr / लोकल / बिन में कॉपी कर सकते हैं ताकि इसे एक्सेस करना आसान हो।

GetTrueName के लिए C स्रोत कोड (पाठ की प्रतिलिपि बनाएँ और फ़ाइल को अपने गृह निर्देशिका में getTrueName.c के रूप में सहेजें):

// getTrueName.c
// 
// DESCRIPTION
//   Resolve HFS and HFS+ aliased files (and soft links), and return the
//   name of the "Original" or actual file. Directories have a "/"
//   appended. The error number returned is 255 on error, 0 if the file
//   was an alias, or 1 if the argument given was not an alias
// 
// BUILD INSTRUCTIONS
//   gcc-3.3 -o getTrueName -framework Carbon getTrueName.c 
//
//     Note: gcc version 4 reports the following warning
//     warning: pointer targets in passing argument 1 of 'FSPathMakeRef'
//       differ in signedness
//
// COPYRIGHT AND LICENSE
//   Copyright 2005 by Thos Davis. All rights reserved.
//   This program is free software; you can redistribute it and/or
//   modify it under the terms of the GNU General Public License as
//   published by the Free Software Foundation; either version 2 of the
//   License, or (at your option) any later version.
//
//   This program is distributed in the hope that it will be useful, but
//   WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
//   General Public License for more details.
//
//   You should have received a copy of the GNU General Public
//   License along with this program; if not, write to the Free
//   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
//   MA 02111-1307 USA


#include <Carbon/Carbon.h> 
#define MAX_PATH_SIZE 1024
#define CHECK(rc,check_value) if ((check_value) != noErr) exit((rc))

int main ( int argc, char * argv[] ) 
  { 
    FSRef               fsRef; 
    Boolean             targetIsFolder; 
    Boolean             wasAliased; 
    UInt8               targetPath[MAX_PATH_SIZE+1]; 
    char *              marker;

    // if there are no arguments, go away
    if (argc < 2 ) exit(255); 

    CHECK( 255,
      FSPathMakeRef( argv[1], &fsRef, NULL ));

    CHECK( 1,
      FSResolveAliasFile( &fsRef, TRUE, &targetIsFolder, &wasAliased));

    CHECK( 255,
      FSRefMakePath( &fsRef, targetPath, MAX_PATH_SIZE)); 

    marker = targetIsFolder ? "/" : "" ;
    printf( "%s%s\n", targetPath, marker ); 

    exit( 1 - wasAliased );
  }

निम्नलिखित को ~ / .bash_profile में शामिल करें या एक नई फ़ाइल बनाएं ~ / .bash_profile निम्नलिखित सामग्री के साथ:

function cd {
  if [ ${#1} == 0 ]; then
    builtin cd
  elif [ -d "${1}" ]; then
    builtin cd "${1}"
  elif [[ -f "${1}" || -L "${1}" ]]; then
    path=$(getTrueName "$1")
    builtin cd "$path"
  else
    builtin cd "${1}"
  fi
}

आपको अपने संशोधित .bash_profile को लोड करने के लिए संभवतः टर्मिनल को पुनरारंभ करना होगा।

Yosemite में परीक्षण किया गया 10.10.2 और gcc 4.2 (Xcode 6.2) और यह काम करता है।

एक समान दृष्टिकोण superuser.com पर उपलब्ध है


3

मैंने @klanomath द्वारा उत्तर का परीक्षण नहीं किया है, लेकिन एक उपनाम का लक्ष्य प्राप्त करने के लिए पायथन पुस्तकालय हुआ करता था, लेकिन Apple के ढांचे से कार्बन समर्थन हटा दिया गया था। इसे ऑब्जेक्टिव C में देखा जा सकता है https://stackoverflow.com/a/21151368/838253

सबसे अच्छा शर्त सिम्बलिंक का उपयोग करना है, लेकिन दुर्भाग्य से फाइंडर आपको ये बनाने की अनुमति नहीं देता है।

मैंने एक OS X सेवा लिखी है, जो सिमलिंक बनाता है (जो कि फाइंडर और टर्मिनल दोनों द्वारा समर्थित है)। यह फाइंडर वर्कफ़्लो में निम्न बैश स्क्रिप्ट चलाता है। (दुर्भाग्य से यह पढ़ने योग्य प्रारूप में ऑटोमेकर कोड को पोस्ट करना संभव नहीं लगता है)।

for f in "$@"
do
 fileSuffix="link"
 fileExists=`ls -d "$f $fileSuffix"`
 fileNumber=0

 until [ $fileExists=="" ]; do
  let fileNumber+=1
  fileSuffix="link $fileNumber"
  fileExists=`ls -d "$f $fileSuffix"`
 done

 echo "$f $fileSuffix"
 ln -s "$f" "$f $fileSuffix"
done

1
एक वाक्य में आप कहते हैं "सबसे अच्छा शर्त सिम्बलिंक का उपयोग करना है, लेकिन दुर्भाग्य से फाइंडर इसका समर्थन नहीं करता है।" और फिर कहते हैं "... जो सहानुभूति पैदा करता है (जो फाइंडर और टर्मिनल दोनों द्वारा समर्थित हैं)" और ये एक-दूसरे के विरोधाभासी प्रतीत होते हैं, इसलिए इसे पुन: दर्ज करने पर विचार करें क्योंकि "फाइंडर इसका समर्थन नहीं करता है" महत्वाकांक्षी है। इसके अलावा curFolderऔर linkFileचर अप्रयुक्त हैं इसलिए वे वहां क्यों हैं? तुलना ऑपरेटर के आस-पास रिक्त स्थान होना चाहिए जैसे $fileExists == ""और $(..)विरासत बैकटिक्स के बजाय उपयोग करने पर विचार करें ।
user3439894

@ user3439894 ने शब्दांकन बदल दिया। आप कोड के बारे में सही हैं। मैंने इसे 2011 में लिखा था, इसके तुरंत बाद मुझे मैक मिला, और इसने तब से काम किया है, और मैंने तब से इसे नहीं देखा है। अप्रयुक्त चर शायद परीक्षण से बचे हैं।
मिलिविस

3

यहाँ मेरा इस पर ले रहा है।

इस फ़ंक्शन को अपने .profile में जोड़ें और लोड करें।

function cd  {
  thePath=`osascript <<EOD
set toPath to ""
tell application "Finder"
    set toPath to (POSIX file "$1") as alias
    set theKind to kind of toPath
    if theKind is "Alias" then
        set toPath to  ((original item of toPath) as alias)
    end if
end tell
return posix path of (toPath)
EOD`
  builtin cd "$thePath";
}

अपडेट करें।

मैंने builtin cd @klanomath उत्तर में दिखाई गई पंक्ति का उपयोग किया है जो आपको cd कमांड को ओवरराइड करने की अनुमति देता है। तो हम अब उपयोग कर सकते हैं:

cd /path/to/example-alias

या

cd /path/to/example

फ़ंक्शन को मूल या सामान्य पथ के मूल पथ पर वापस लौटना चाहिए।


1

जबकि एक प्रतीकात्मक लिंक (UNIX उपनाम) फाइंडर के अंदर फाइंडर उर्फ ​​के रूप में एक ही दिखता है, वे दो अलग-अलग प्रकार के उपनाम हैं।

एक प्रतीकात्मक लिंक केवल उसी रास्ते को पकड़ेगा जो उसे ले जाता है और स्थायी रूप से या अस्थायी रूप से टूट जाएगा यदि संसाधन को स्थानांतरित कर दिया जाता है या क्रमशः डिस्कनेक्ट किए गए ड्राइव या शेयर पर।

एक खोजक उर्फ ​​तकनीकी रूप से खोजक के निर्देशों के साथ एक साधारण फ़ाइल है। खोजक इस जानकारी का उपयोग कुछ हद तक स्थानांतरित लक्ष्य फ़ाइल / निर्देशिका का पता लगाने के लिए कर सकता है। यदि किसी अन्य का लक्ष्य संसाधन माउंटेड नेटवर्क साझा बिंदु पर है, तो यह खोलने के लिए शेयर बिंदु पर आपको लॉग करने के लिए किस किचेन आइटम का उपयोग करने की जानकारी रखता है।

इसलिए, जब तक आप फाइंडर अलियास फ़ाइल को पढ़ने के लिए कोई स्क्रिप्ट या प्रोग्राम नहीं लिखते हैं, तब तक वह इसका उपयोग निर्देशिका के रूप में नहीं करेगा, बल्कि टर्मिनल में फ़ाइल के रूप में करेगा।

वैकल्पिक रूप से, आप वर्तमान खोजक उपनाम को हटा सकते हैं और इसके स्थान पर एक प्रतीकात्मक लिंक बना सकते हैं। ln -s /path/to/originalवर्तमान निर्देशिका में एक प्रतीकात्मक लिंक बनाने के लिए कमांड होगी । पथ पूर्ण या सापेक्ष पथ हो सकता है।


1
  1. @ मार्कशीट की अपील पर काम हुआ, लेकिन एक चेतावनी संदेश था: osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)

इस टिप की मदद से , मैंने चेतावनी संदेश के ऊपर हटाने के लिए @ चिह्न के एप्सस्क्रिप्ट को संशोधित किया

  1. @ मार्कशीट की एप्सस्क्रिप्ट थोड़ी धीमी है, क्योंकि यह हमेशा एप्सस्क्रिप्ट को आमंत्रित करती है। तो @ klanomath की नोक जो कि ऊपर सूचीबद्ध है, का अनुसरण करते हुए, मैंने स्क्रिप्ट को केवल तब संशोधित करने के लिए एप्स्क्रिप्ट को संशोधित किया जब लक्ष्य वस्तु उर्फ ​​हो।
# Overriding cd to enable make alias available in CLI

function cd  {
    if [ ${#1} == 0 ]; then
        builtin cd
    elif [ -d "${1}" ]; then
        builtin cd "${1}"
    elif [[ -f "${1}" || -L "${1}" ]]; then
        thePath=`osascript <<EOD
set toPath to ""
tell application "Finder"
    set toPath to (POSIX file ((do shell script "pwd")&"/$1")) as alias
    set theKind to kind of toPath
    if theKind is "Alias" then
        set toPath to  ((original item of toPath) as alias)
    end if
end tell
return posix path of (toPath)
EOD`
        builtin cd "$thePath";
    else
        builtin cd "${1}"
    fi
}

-2

अधिकांश ऑपरेटिंग सिस्टम (विंडोज के अलावा) की तरह, ओएस एक्स बैश स्क्रिप्ट का समर्थन करता है। पहले अपने डेस्कटॉप पर फ़ाइल बनाएं (या आप जो भी स्थान चाहेंगे):

टच ~ / डेस्कटॉप / PlexConnect.sh अगला, फ़ाइल की अनुमतियाँ सेट करें जैसे कि यह निष्पादन योग्य है:

chmod + x ~ / Desktop / PlexConnect.sh तब आप अपनी पसंद के टेक्स्ट एडिटर के साथ स्क्रिप्ट की सामग्री को संपादित कर सकते हैं, बस सुनिश्चित करें कि यह निम्न पंक्ति से शुरू होता है ताकि सिस्टम शेल (बैश) का उपयोग करके इसे चलाना जानता हो:

! / Bin / bash

तब फ़ाइल को डबल-क्लिक किया जा सकता है, टर्मिनल लॉन्च करना और उसे निष्पादित करना।

हालांकि, इसके लिए एक अधिक सुंदर समाधान एक AppleScript एप्लिकेशन बनाना हो सकता है जो आपके लिए कमांड चलाता है। "स्क्रिप्ट एडिटर" एप्लिकेशन खोलें और निम्नलिखित में पेस्ट करें:

शेल स्क्रिप्ट "प्रशासक विशेषाधिकारों के साथ" /Applications/PlexConnect-master/PlexConnect.py "इसे एक" एप्लिकेशन "के रूप में सहेजें, जो भी आप चाहते हैं उसका नामकरण करें। इसे खोलते समय, यह आपको ओएस एक्स के मानक पासवर्ड प्रॉम्प्ट देगा, स्क्रिप्ट निष्पादित करेगा, फिर खुद को बंद कर देगा।


यह शीर्ष पर पूछे गए प्रश्न का उत्तर कैसे देता है? स्पष्ट करते समय क्या आप कृपया अपने पोस्ट के प्रारूपण को भी ठीक कर सकते हैं?
नोहिलसाइड

सवाल में पूछे गए उपनामों के साथ यह करने के लिए क्या है? कृपया अपना उत्तर भी प्रारूपित करें जैसा कि सहायता केंद्र में वर्णित है। apple.stackexchange.com/help/formatting
user151019
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.