Comment accéder à l'alias depuis le terminal?

9

Par alias, je veux dire le raccourci de dossier créé lorsque vous cliquez avec le bouton droit sur un dossier dans le Finder et sélectionnez "Créer un alias". Je peux parcourir les liens symboliques dans Terminal avec cd, mais il ne fonctionne pas sur les alias: bash: cd: example-alias: Not a directory. Est-il possible de changer de répertoire vers la destination d'un alias dans Terminal?

Steven
la source
J'ai mis à jour ma réponse
markhunte

Réponses:

5

Pour activer le cd'ing dans un alias de dossier, j'ai trouvé ce qui suit dans Mac OS X Hints .

Compilez le code source ci-dessous avec la commande suivante:

gcc -o getTrueName -framework Carbon getTrueName.c

Cela créera l'exécutable «getTrueName» dans le même répertoire que la source. Vous pouvez l'ajouter à votre PATH, ou simplement le copier directement dans / usr / bin ou / usr / local / bin afin qu'il soit facile d'accès.

Code source C pour getTrueName (copiez le texte et enregistrez le fichier sous getTrueName.c dans votre répertoire personnel):

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

Incluez les éléments suivants dans ~ / .bash_profile ou créez un nouveau fichier ~ / .bash_profile avec le contenu suivant:

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
}

Vous devrez probablement redémarrer Terminal pour charger votre .bash_profile modifié.

Testé dans Yosemite 10.10.2 & gcc 4.2 (Xcode 6.2) et cela fonctionne.

Une approche similaire est disponible sur superuser.com

klanomath
la source
3

Je n'ai pas testé la réponse de @klanomath, mais il y avait auparavant une bibliothèque Python pour obtenir la cible d'un alias, mais le support Carbon a été supprimé des frameworks Apple. Cela peut être fait dans Objective C voir https://stackoverflow.com/a/21151368/838253 .

Le mieux est d'utiliser des liens symboliques, mais malheureusement le Finder ne vous permet pas de les créer.

J'ai écrit un service OS X qui crée des liens symboliques (qui sont pris en charge par le Finder et le terminal). Cela exécute le script bash suivant dans un flux de travail du Finder. (Malheureusement, il ne semble pas possible de publier le code Automator dans un format lisible).

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
la source
1
Dans une phrase, vous dites: "Le meilleur pari est d'utiliser des liens symboliques, mais malheureusement le Finder ne prend pas cela en charge." puis dites "... qui crée des liens symboliques (qui sont pris en charge à la fois par le Finder et le Terminal)" et ceux-ci semblent se contredire, alors envisagez de le reformuler car "le Finder ne prend pas cela en charge" est ambitieux. De plus, les variables curFolderet linkFilene sont pas utilisées, alors pourquoi sont-elles présentes? Il devrait y avoir des espaces autour de l'opérateur de comparaison, par exemple, $fileExists == ""et envisagez d'utiliser $(..)des raccourcis hérités.
user3439894
@ user3439894 a changé le libellé. Vous avez raison sur le code. J'ai écrit cela en 2011, peu de temps après avoir obtenu un Mac, et cela a fonctionné depuis, et je ne l'ai pas revu depuis. Les variables inutilisées sont probablement laissées par les tests.
Milliways
3

Voici mon point de vue à ce sujet.

ajoutez et chargez cette fonction dans votre .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";
}

Mise à jour.

J'ai utilisé la builtin cd ligne indiquée dans la réponse @klanomath qui vous permet de remplacer la commande cd. Nous pouvons donc maintenant utiliser:

cd /path/to/example-alias

ou

cd /path/to/example

La fonction doit retourner et cd au chemin d'origine des alias d'origine ou le chemin normal.

markhunte
la source
1

Alors qu'un lien symbolique (alias UNIX) ressemble à un alias du Finder dans le Finder, il s'agit de deux types d'alias complètement différents.

Un lien symbolique ne maintiendra le chemin vers lequel il mène et se rompra définitivement ou temporairement que si la ressource est déplacée ou sur un lecteur ou un partage déconnecté respectivement.

Un alias du Finder est techniquement un fichier ordinaire contenant des instructions pour le Finder. Le Finder peut utiliser ces informations pour localiser un fichier / répertoire cible déplacé dans une certaine mesure. Si une ressource cible d'un alias se trouve sur un point de partage réseau monté, elle contient également des informations sur l'élément de trousseau à utiliser pour vous connecter au point de partage afin de l'ouvrir.

Ainsi, à moins que vous n'écriviez un script ou un programme pour lire le fichier d'alias du Finder, il ne l'utilisera pas comme répertoire, mais comme fichier dans Terminal.

Vous pouvez également supprimer l'alias du Finder actuel et créer un lien symbolique à sa place. La commande serait ln -s /path/to/originalde créer un lien symbolique dans le répertoire courant. Le chemin peut être un chemin complet ou relatif.

Phénix
la source
1
  1. @ markhunte's applescript a fonctionné, mais il y avait un message d'avertissement: osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)

À l'aide de cette astuce , j'ai modifié l'applescript de @ markunte pour supprimer le message d'avertissement ci-dessus

  1. @ applescript de markhunte est légèrement lent car il invoque toujours l'applescript. Donc, en suivant l'astuce de @ klanomath qui est répertoriée ci-dessus, j'ai modifié le script pour invoquer l'applescript uniquement lorsque l'objet cible est un 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
}
z0nam
la source
-2

Comme la plupart des systèmes d'exploitation (à part Windows), OS X prend en charge les scripts Bash. Créez d'abord le fichier sur votre bureau (ou à l'emplacement que vous souhaitez):

touchez ~ / Desktop / PlexConnect.sh Ensuite, définissez les autorisations du fichier de sorte qu'il soit exécutable:

chmod + x ~ / Desktop / PlexConnect.sh Vous pouvez ensuite éditer le contenu du script avec l'éditeur de texte de votre choix, assurez-vous simplement qu'il commence par la ligne suivante afin que le système sache l'exécuter en utilisant le shell (Bash):

! / bin / bash

Le fichier peut ensuite être double-cliqué, en lançant Terminal et en l'exécutant.

Une solution plus élégante pour cela, cependant, peut être de créer une application AppleScript qui exécute la commande pour vous. Ouvrez l'application "Script Editor" et collez-la comme suit:

faire le script shell "/Applications/PlexConnect-master/PlexConnect.py" avec des privilèges d'administrateur Enregistrez-le comme une "Application", en le nommant comme vous le souhaitez. Lors de son ouverture, il vous donnera l'invite de mot de passe standard d'OS X, exécutera le script, puis se fermera.

Beautyepic
la source
Comment cela répond-il à la question posée en haut? Tout en clarifiant, pouvez-vous également corriger la mise en forme de votre message?
nohillside
Qu'est-ce que cela a à voir avec les alias comme demandé dans la question Veuillez également formater votre réponse comme décrit dans le centre d'aide apple.stackexchange.com/help/formatting
user151019