Come andare alias dal terminale?


9

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


Ho aggiornato la mia risposta
markhunte,

Risposte:


5

Per abilitare quindi passare una cartella alias ho trovato quanto segue al Mac OS X Hints .

Compilare il codice sorgente di seguito con il seguente comando:

gcc -o getTrueName -framework Carbon getTrueName.c

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

Codice sorgente C 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 dovrai riavviare Terminal per caricare il tuo .bash_profile modificato.

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

Un approccio simile è disponibile su superuser.com


3

Non ho testato la risposta di @klanomath, ma c'era una libreria Python per ottenere il target di un alias, ma il supporto Carbon è stato rimosso dai framework Apple. Può essere fatto nell'Obiettivo C consultare https://stackoverflow.com/a/21151368/838253 .

La scommessa migliore è usare i symlink, ma sfortunatamente Finder non ti consente di crearli.

Ho scritto un servizio OS X che crea collegamenti simbolici (che sono supportati sia dal Finder che dal Terminale). Questo esegue il seguente script bash in un flusso di lavoro del Finder. (Purtroppo 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

1
In una frase dici "La scommessa migliore è usare i symlink, ma sfortunatamente Finder non lo supporta." e poi dire "... che crea collegamenti simbolici (che sono supportati sia dal Finder che dal Terminale)" e questi sembrano contraddirsi a vicenda, quindi considerare riformulare come "Finder non supporta questo" è ambizioso. Anche le variabili curFoldere linkFilesono inutilizzate, quindi perché sono lì? Dovrebbero esserci spazi attorno all'operatore di confronto, ad esempio, $fileExists == ""e considerare l'utilizzo $(..)invece di backtick legacy.
user3439894

@ user3439894 testo modificato. Hai ragione sul codice. L'ho scritto nel 2011, poco dopo aver ottenuto un Mac, e ha funzionato da allora, e da allora non lo vedo più. Le variabili non utilizzate sono probabilmente rimaste dal test.
Milliways,

3

Ecco la mia opinione su questo.

aggiungi e carica questa funzione sul tuo .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";
}

Aggiornare.

Ho usato la builtin cd linea 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 tornare e cd al percorso originale dell'alias originale o al percorso normale.


1

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

Un collegamento simbolico manterrà il percorso che conduce e si interromperà permanentemente o temporaneamente se la risorsa viene spostata o su un'unità disconnessa o condivisa rispettivamente.

Un alias Finder è tecnicamente un normale file con le istruzioni per il Finder. Il Finder può utilizzare queste informazioni per individuare in una certa misura un file / directory di destinazione spostato. Se una risorsa di destinazione di un alias si trova su un punto di condivisione di rete montato, contiene anche informazioni sull'elemento Keychain da utilizzare per accedere al punto di condivisione per aprirlo.

Pertanto, a meno che non si scriva uno script o un programma per leggere il file alias Finder, non lo utilizzerà come directory, ma come file nel Terminale.

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


1
  1. Lo script di mele di markhunte ha funzionato, ma c'era un messaggio di avvertimento: osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)

Con l'aiuto di questo suggerimento , ho modificato lo script di apple di @ markunte per rimuovere il messaggio di avviso sopra riportato

  1. Lo script di apple di @ markhunte è leggermente lento perché invoca sempre lo script di mele. Quindi seguendo il suggerimento di @ klanomath che è elencato sopra, ho modificato lo script per invocare lo script di mele solo quando l'oggetto target è alias.
# 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

Come la maggior parte dei sistemi operativi (oltre a Windows), OS X supporta gli script Bash. Innanzitutto crea il file sul desktop (o in qualsiasi posizione desideri):

toccare ~ / Desktop / PlexConnect.sh Quindi, impostare le autorizzazioni del file in modo che sia eseguibile:

chmod + x ~ / Desktop / PlexConnect.sh Puoi quindi modificare il contenuto dello script con il tuo editor di testo preferito, assicurati solo che inizi con la seguente riga in modo che il sistema sappia eseguirlo usando la shell (Bash):

! / Bin / bash

È quindi possibile fare doppio clic sul file, avviare Terminal ed eseguirlo.

Una soluzione più elegante per questo, tuttavia, potrebbe essere quella di creare un'applicazione AppleScript che esegue il comando per te. Aprire l'applicazione "Script Editor" e incollare quanto segue:

esegui lo script di shell "/Applications/PlexConnect-master/PlexConnect.py" con i privilegi di amministratore Salvalo come "Applicazione", denominandolo come preferisci. Quando lo si apre, ti darà la richiesta di password standard di OS X, eseguirà lo script, quindi si chiuderà.


In che modo risponde alla domanda posta in cima? Mentre chiarisci puoi correggere anche la formattazione del tuo post?
Nohillside

Che cosa ha a che fare con gli alias come richiesto nella domanda Si prega inoltre di formattare la risposta come descritto nel Centro assistenza apple.stackexchange.com/help/formatting
user151019
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.