Wie gehe ich vom Terminal zum Alias?

9

Mit Alias ​​meine ich die Ordnerverknüpfung, die erstellt wird, wenn Sie mit der rechten Maustaste auf einen Ordner im Finder klicken und "Alias ​​erstellen" auswählen. Ich kann symbolische Links in Terminal mit durchlaufen cd, aber es funktioniert nicht bei Aliasen : bash: cd: example-alias: Not a directory. Ist es möglich, das Verzeichnis in Terminal auf das Ziel eines Alias ​​zu ändern?

Steven
quelle
Ich habe meine Antwort aktualisiert
markhunte

Antworten:

5

Um das CD'ing in einen Ordner-Alias ​​zu aktivieren, habe ich unter Mac OS X Hinweise Folgendes gefunden .

Kompilieren Sie den folgenden Quellcode mit dem folgenden Befehl:

gcc -o getTrueName -framework Carbon getTrueName.c

Dadurch wird die ausführbare Datei 'getTrueName' im selben Verzeichnis wie die Quelle erstellt. Sie können es Ihrem PATH hinzufügen oder einfach direkt nach / usr / bin oder / usr / local / bin kopieren, damit Sie leicht darauf zugreifen können.

C-Quellcode für getTrueName (kopieren Sie den Text und speichern Sie die Datei als getTrueName.c in Ihrem Home-Verzeichnis):

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

Fügen Sie Folgendes in ~ / .bash_profile ein oder erstellen Sie eine neue Datei ~ / .bash_profile mit folgendem Inhalt:

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
}

Sie müssen Terminal wahrscheinlich neu starten, um Ihr geändertes .bash_profile zu laden.

Getestet in Yosemite 10.10.2 & gcc 4.2 (Xcode 6.2) und es funktioniert.

Ein ähnlicher Ansatz ist unter superuser.com verfügbar

Klanomath
quelle
3

Ich habe die Antwort von @klanomath nicht getestet, aber es gab früher eine Python-Bibliothek, um das Ziel eines Alias ​​zu ermitteln, aber die Carbon-Unterstützung wurde aus den Apple-Frameworks entfernt. Dies kann in Ziel C unter https://stackoverflow.com/a/21151368/838253 erfolgen .

Am besten verwenden Sie Symlinks, aber mit Finder können Sie diese leider nicht erstellen.

Ich habe einen OS X-Dienst geschrieben, der Symlinks erstellt (die sowohl vom Finder als auch vom Terminal unterstützt werden). Dadurch wird das folgende Bash-Skript in einem Finder-Workflow ausgeführt. (Leider scheint es nicht möglich zu sein, Automator-Code in einem lesbaren Format zu veröffentlichen.)

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
quelle
1
In einem Satz sagen Sie: "Die beste Wette ist die Verwendung von Symlinks, aber leider unterstützt Finder dies nicht." und sagen Sie dann "... was Symlinks erstellt (die sowohl vom Finder als auch vom Terminal unterstützt werden)" und diese scheinen sich zu widersprechen. Überlegen Sie also, es neu zu formulieren, da "Finder unterstützt dies nicht" ehrgeizig ist. Auch die Variablen curFolderund linkFilewerden nicht verwendet. Warum sind sie dort? Es sollte Räume rund um den Vergleichsoperator zB sein $fileExists == ""und prüfen , mit $(..)anstelle von Legacy - Backticks.
user3439894
@ user3439894 Wortlaut geändert. Sie haben Recht mit dem Code. Ich habe das 2011 geschrieben, kurz nachdem ich einen Mac bekommen hatte, und es hat seitdem funktioniert, und ich habe es seitdem nicht mehr angeschaut. Die nicht verwendeten Variablen bleiben wahrscheinlich beim Testen übrig.
Milliways
3

Hier ist meine Meinung dazu.

Fügen Sie diese Funktion hinzu und laden Sie sie in Ihr .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";
}

Aktualisieren.

Ich habe die builtin cd in der Antwort @klanomath gezeigte Zeile verwendet, mit der Sie den Befehl cd überschreiben können. So können wir jetzt verwenden:

cd /path/to/example-alias

oder

cd /path/to/example

Die Funktion sollte zurückkehren und zum ursprünglichen Pfad der ursprünglichen Aliase oder zum normalen Pfad zurückkehren.

markhunte
quelle
1

Ein symbolischer Link (UNIX-Alias) sieht zwar genauso aus wie ein Finder-Alias ​​in Finder, es handelt sich jedoch um zwei völlig unterschiedliche Arten von Aliasen.

Eine symbolische Verknüpfung enthält nur den Pfad, zu dem sie führt, und wird dauerhaft oder vorübergehend unterbrochen, wenn die Ressource verschoben wird oder sich auf einem nicht verbundenen Laufwerk bzw. einer nicht freigegebenen Freigabe befindet.

Ein Finder-Alias ​​ist technisch gesehen eine normale Datei mit Anweisungen für den Finder. Der Finder kann diese Informationen verwenden, um eine verschobene Zieldatei / ein verschobenes Zielverzeichnis bis zu einem gewissen Grad zu finden. Wenn sich eine Zielressource eines Alias ​​auf einem bereitgestellten Netzwerkfreigabepunkt befindet, enthält sie auch Informationen darüber, mit welchem ​​Schlüsselbundelement Sie am Freigabepunkt angemeldet werden können, um ihn zu öffnen.

Wenn Sie also kein Skript oder Programm zum Auslesen der Finder-Aliasdatei schreiben, wird diese nicht als Verzeichnis, sondern als Datei in Terminal verwendet.

Alternativ können Sie den aktuellen Finder-Alias ​​entfernen und an seiner Stelle einen symbolischen Link erstellen. Der Befehl wäre ln -s /path/to/original, einen symbolischen Link im aktuellen Verzeichnis zu erstellen. Der Pfad kann ein vollständiger oder relativer Pfad sein.

Phönix
quelle
1
  1. @ markhunte's Applescript hat funktioniert, aber es gab eine Warnmeldung: osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)

Mithilfe dieses Tipps habe ich das Applescript von @ markunte geändert, um die obige Warnmeldung zu entfernen

  1. Das Applescript von @ markhunte ist etwas langsam, da es immer das Applescript aufruft. Nach dem oben aufgeführten Tipp von @ klanomath habe ich das Skript so geändert, dass das Applescript nur aufgerufen wird, wenn das Zielobjekt ein Alias ​​ist.
# 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
quelle
-2

Wie die meisten Betriebssysteme (außer Windows) unterstützt OS X Bash-Skripte. Erstellen Sie zuerst die Datei auf Ihrem Desktop (oder an einem beliebigen Ort):

Berühren Sie ~ / Desktop / PlexConnect.sh. Legen Sie als Nächstes die Berechtigungen der Datei so fest, dass sie ausführbar ist:

chmod + x ~ / Desktop / PlexConnect.sh Sie können den Inhalt des Skripts dann mit einem Texteditor Ihrer Wahl bearbeiten. Stellen Sie lediglich sicher, dass er mit der folgenden Zeile beginnt, damit das System ihn mithilfe der Shell (Bash) ausführen kann:

! / bin / bash

Die Datei kann dann doppelklicken, Terminal starten und ausführen.

Eine elegantere Lösung hierfür könnte jedoch darin bestehen, eine AppleScript-Anwendung zu erstellen, die den Befehl für Sie ausführt. Öffnen Sie die Anwendung "Skript-Editor" und fügen Sie Folgendes ein:

Führen Sie das Shell-Skript "/Applications/PlexConnect-master/PlexConnect.py" mit Administratorrechten aus. Speichern Sie dieses als "Anwendung" und benennen Sie es nach Ihren Wünschen. Beim Öffnen erhalten Sie die Standardkennwortabfrage von OS X, führen das Skript aus und schließen sich selbst.

Beautyepic
quelle
Wie beantwortet dies die oben gestellte Frage? Können Sie bei der Klärung bitte auch die Formatierung Ihres Beitrags korrigieren?
Nohillside
Was hat dies mit den in der Frage gestellten Aliasnamen zu tun ?
Formatieren