Come andare ad un alias dal terminale?

6

Per alias, intendo il collegamento alla cartella creato quando si fa clic con il pulsante destro del mouse su una cartella in Finder e si seleziona "Crea alias". Posso attraversare i collegamenti simbolici in Terminal con cd , ma non funziona sugli alias: bash: cd: example-alias: Not a directory . È possibile cambiare la directory in una destinazione di alias in Terminale?

    
posta Steven 13.04.2015 - 19:49
fonte

4 risposte

4

Per abilitare cd'ing in un alias di cartella ho trovato quanto segue in Suggerimenti per Mac OS X .

Compila il seguente codice sorgente con il seguente comando:

gcc -o getTrueName -framework Carbon getTrueName.c

Questo creerà l'eseguibile 'getTrueName' nella stessa directory dell'origine. Puoi aggiungerlo al tuo PERCORSO, o semplicemente copiarlo direttamente in / usr / bin o in / usr / local / bin in modo che sia di facile accesso.

C codice sorgente per getTrueName (copia il testo e salva il file come getTrueName.c nella tua home directory ):

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

Includi quanto segue in ~ / .bash_profile o crea un nuovo file ~ / .bash_profile con il seguente contenuto:

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
}

Probabilmente devi riavviare Terminal per caricare il tuo .bash_profile modificato.

Testato su Yosemite 10.10.2 & gcc 4.2 (Xcode 6.2) e funziona.

Un approccio simile è disponibile su superuser.com

    
risposta data 13.04.2015 - 20:37
fonte
3

Non ho testato la risposta di @klanomath, ma una volta c'era una libreria Python per ottenere l'obiettivo di un alias, ma il supporto Carbon è stato rimosso dai framework Apple. Può essere fatto nell'obiettivo C vedi link .

La soluzione migliore è usare i collegamenti simbolici, ma sfortunatamente Finder non ti consente di crearli.

Ho scritto un servizio OS X che crea collegamenti simbolici (supportati sia dal Finder che dal Terminale). Questo esegue il seguente script bash in un flusso di lavoro del Finder. (Sfortunatamente non sembra possibile pubblicare il codice di Automator in un formato leggibile).

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
    
risposta data 13.04.2015 - 21:18
fonte
1

Ecco la mia opinione su questo.

aggiungi e carica questa funzione nel tuo profilo.

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";
}

Aggiorna.

Ho usato la riga builtin cd mostrata nella risposta @klanomath che ti permette di sovrascrivere il comando cd. Quindi ora possiamo usare:

cd /path/to/example-alias

o

cd /path/to/example

La funzione dovrebbe ritornare e andare al percorso originale degli alias originali o al percorso normale.

    
risposta data 15.04.2015 - 00:57
fonte
0

Mentre un collegamento simbolico (alias UNIX) ha lo stesso aspetto di un alias del Finder all'interno del Finder, sono due diversi tipi di alias completi.

Un link simbolico manterrà solo il percorso a cui conduce e verrà interrotto in modo permanente o temporaneo se la risorsa viene spostata o su un'unità disconnessa o condivisa rispettivamente.

Un alias del Finder è tecnicamente un file ordinario con le istruzioni per il Finder. Il Finder può utilizzare queste informazioni per individuare un file / directory di destinazione spostato in una certa misura. Se una risorsa di destinazione di un alias si trova su un punto di condivisione della rete montata, contiene anche informazioni su quale elemento Keychain utilizzare per accedere al punto di condivisione per poterlo aprire.

Quindi, a meno che tu non scriva uno script o un programma per leggere il file alias del Finder, non lo userà come directory, ma come un file in Terminal.

In alternativa, puoi rimuovere l'alias corrente del Finder e creare un collegamento simbolico al suo posto. Il comando sarebbe ln -s /path/to/original per creare un collegamento simbolico nella directory corrente. Il percorso può essere un percorso completo o relativo.

    
risposta data 13.04.2015 - 20:11
fonte

Leggi altre domande sui tag