Jak przejść do aliasu z terminala?

9

Przez alias rozumiem skrót do folderu utworzony po kliknięciu folderu prawym przyciskiem myszy w Finderze i wybraniu „Utwórz alias”. Mogę przemierzać linki symboliczne w Terminalu z cd, ale nie działa na aliasów: bash: cd: example-alias: Not a directory. Czy w terminalu można zmienić katalog na miejsce docelowe aliasu?

Steven
źródło
Zaktualizowałem swoją odpowiedź
markhunte

Odpowiedzi:

5

Aby włączyć cd'ing do aliasu folderu, znalazłem następujące informacje w Mac OS X Hints .

Skompiluj poniższy kod źródłowy za pomocą następującego polecenia:

gcc -o getTrueName -framework Carbon getTrueName.c

Spowoduje to utworzenie pliku wykonywalnego „getTrueName” w tym samym katalogu co źródło. Możesz dodać go do ŚCIEŻKI lub po prostu skopiować bezpośrednio do / usr / bin lub / usr / local / bin, aby był łatwo dostępny.

Kod źródłowy C dla getTrueName (skopiuj tekst i zapisz plik jako getTrueName.c w katalogu domowym):

// 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 );
  }

Uwzględnij następujące elementy w ~ / .bash_profile lub utwórz nowy plik ~ / .bash_profile o następującej treści:

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
}

Prawdopodobnie musisz ponownie uruchomić Terminal, aby załadować zmodyfikowany plik .bash_profile.

Testowany w Yosemite 10.10.2 i gcc 4.2 (Xcode 6.2) i działa.

Podobne podejście jest dostępne na superuser.com

klanomath
źródło
3

Nie testowałem odpowiedzi przez @klanomath, ale kiedyś była biblioteka Pythona, aby uzyskać cel aliasu, ale obsługa Carbon została usunięta z frameworków Apple. Można to zrobić w celu C, patrz https://stackoverflow.com/a/21151368/838253 .

Najlepiej jest użyć dowiązań symbolicznych, ale niestety Finder nie pozwala na ich utworzenie.

Napisałem usługę OS X, która tworzy dowiązania symboliczne (obsługiwane zarówno przez Findera, jak i Terminal). Spowoduje to uruchomienie następującego skryptu bash w przepływie pracy Findera. (Niestety nie wydaje się możliwe opublikowanie kodu Automatora w czytelnym formacie).

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
Milliways
źródło
1
W jednym zdaniu mówisz: „Najlepszym rozwiązaniem jest użycie dowiązań symbolicznych, ale niestety Finder tego nie obsługuje”. a następnie powiedz „... który tworzy dowiązania symboliczne (które są obsługiwane zarówno przez Findera, jak i Terminal)”, a te wydają się być ze sobą sprzeczne, więc rozważ przeredagowanie go, ponieważ „Finder tego nie obsługuje” jest ambitny. Również zmienne curFolderi linkFilesą nieużywane, więc dlaczego tam są? Wokół operatora porównania powinny być np. Spacje $fileExists == ""i rozważyć użycie $(..)zamiast starszego backticka.
user3439894
@ user3439894 zmienił brzmienie. Masz rację co do kodu. Napisałem to w 2011 roku, krótko po tym, jak dostałem komputer Mac, i od tego czasu działa, i od tamtej pory nie patrzyłem na to. Niewykorzystane zmienne prawdopodobnie pozostały po testach.
Milliways,
3

Oto moje zdanie na ten temat.

dodaj i załaduj tę funkcję do swojego .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";
}

Aktualizacja.

Użyłem builtin cd linii pokazanej w odpowiedzi @klanomath, która pozwala zastąpić polecenie cd. Możemy więc teraz użyć:

cd /path/to/example-alias

lub

cd /path/to/example

Funkcja powinna powrócić i cd do oryginalnej ścieżki oryginalnej aliasu lub zwykłej ścieżki.

markhunte
źródło
1

Chociaż dowiązanie symboliczne (alias UNIX) wygląda tak samo jak alias Findera w Finderze, są to dwa zupełnie różne typy aliasów.

Łącze symboliczne utrzyma tylko ścieżkę, do której prowadzi, i zostanie trwale lub tymczasowo zerwane, jeśli zasób zostanie odpowiednio przeniesiony lub na odłączonym dysku lub współużytkowany.

Alias ​​Findera jest technicznie zwykłym plikiem z instrukcjami dla Findera. Finder może wykorzystać te informacje do zlokalizowania do pewnego stopnia przeniesionego docelowego pliku / katalogu. Jeśli zasób docelowy aliasu znajduje się w zamontowanym sieciowym punkcie udostępniania, zawiera również informacje o tym, który element pęku kluczy służy do zalogowania się do punktu udostępniania w celu jego otwarcia.

Tak więc, dopóki nie napiszesz skryptu lub programu do odczytu pliku aliasu Findera, nie będzie on używał go jako katalogu, ale jako plik w terminalu.

Alternatywnie możesz usunąć bieżący alias Findera i utworzyć symboliczne łącze w jego miejscu. Poleceniem byłoby ln -s /path/to/originalutworzenie dowiązania symbolicznego w bieżącym katalogu. Ścieżka może być ścieżką pełną lub względną.

Feniks
źródło
1
  1. @ skrypt jabłkowy markhunte działał, ale pojawił się komunikat ostrzegawczy: osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)

Za pomocą tej wskazówki zmodyfikowałem skrypt apple @ markunte, aby usunąć powyższy komunikat ostrzegawczy

  1. @ markhunte's applecript jest nieco powolny, ponieważ zawsze wywołuje applecript. Więc podążając za wskazówką @ klanomath wymienioną powyżej, zmodyfikowałem skrypt, aby wywoływał skrypt Apple tylko wtedy, gdy obiekt docelowy jest aliasem.
# 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
}
z0nam
źródło
-2

Jak większość systemów operacyjnych (oprócz Windows), OS X obsługuje skrypty Bash. Najpierw utwórz plik na pulpicie (lub w dowolnej innej lokalizacji):

dotknij ~ / Desktop / PlexConnect.sh Następnie ustaw uprawnienia do pliku, aby był wykonywalny:

chmod + x ~ / Desktop / PlexConnect.sh Następnie możesz edytować zawartość skryptu za pomocą dowolnego edytora tekstowego, po prostu upewnij się, że zaczyna się on od następującego wiersza, aby system wiedział, że można go uruchomić za pomocą powłoki (Bash):

! / bin / bash

Plik można następnie kliknąć dwukrotnie, uruchamiając Terminal i wykonując go.

Bardziej eleganckim rozwiązaniem tego może być jednak utworzenie aplikacji AppleScript, która uruchomi polecenie za Ciebie. Otwórz aplikację „Script Editor” i wklej w następujący sposób:

wykonaj skrypt powłoki „/Applications/PlexConnect-master/PlexConnect.py” z uprawnieniami administratora Zapisz to jako „aplikację”, nadając mu dowolną nazwę. Po otwarciu wyświetli się standardowe hasło OS X, uruchom skrypt, a następnie zamknij się.

Beautyepic
źródło
Jak to odpowiada na pytanie zadane u góry? Czy wyjaśniając, czy możesz również poprawić formatowanie swojego postu?
nohillside
Co to ma wspólnego z aliasami zadanymi
user151019