¿Cómo ir al alias desde la terminal?

9

Por alias, me refiero al acceso directo a la carpeta creado cuando haces clic derecho en una carpeta en Finder y seleccionas "Crear alias". Puedo Seguir enlace simbólico en la Terminal con cd, pero no funciona en los alias: bash: cd: example-alias: Not a directory. ¿Es posible cambiar el directorio al destino de un alias en la Terminal?

Steven
fuente
He actualizado mi respuesta
markhunte

Respuestas:

5

Para habilitar una carpeta de cambiar al alias que he encontrado lo siguiente en Mac OS X Hints .

Compile el siguiente código fuente con el siguiente comando:

gcc -o getTrueName -framework Carbon getTrueName.c

Esto creará el ejecutable 'getTrueName' en el mismo directorio que la fuente. Puede agregarlo a su RUTA, o simplemente copiarlo directamente a / usr / bin o / usr / local / bin para que sea fácil acceder.

Código fuente C para getTrueName (copie el texto y guarde el archivo como getTrueName.c en su directorio de inicio):

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

Incluya lo siguiente en ~ / .bash_profile o cree un nuevo archivo ~ / .bash_profile con el siguiente contenido:

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
}

Probablemente tenga que reiniciar la Terminal para cargar su .bash_profile modificado.

Probado en Yosemite 10.10.2 y gcc 4.2 (Xcode 6.2) y funciona.

Un enfoque similar está disponible en superuser.com

klanomath
fuente
3

No he probado la respuesta de @klanomath, pero solía haber una biblioteca de Python para obtener el objetivo de un alias, pero el soporte de Carbon se eliminó de los marcos de Apple. Se puede hacer en el Objetivo C, consulte https://stackoverflow.com/a/21151368/838253 .

La mejor opción es usar enlaces simbólicos, pero desafortunadamente Finder no le permite crearlos.

He escrito un servicio OS X que crea enlaces simbólicos (que son compatibles con Finder y Terminal). Esto ejecuta el siguiente script bash en un flujo de trabajo del Finder. (Desafortunadamente, no parece posible publicar el código de Automator en un formato legible).

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
fuente
1
En una oración dices: "La mejor opción es usar enlaces simbólicos, pero desafortunadamente Finder no lo admite". y luego diga "... lo que crea enlaces simbólicos (que son compatibles tanto con Finder como con Terminal)" y estos parecen contradecirse entre sí, así que considere volver a redactarlo como "Finder no admite esto" es ambicioso. Además, las variables curFoldery linkFileno se utilizan, ¿por qué están allí? Debe haber espacios alrededor del operador de comparación, por ejemplo, $fileExists == ""y considere usar en $(..)lugar de backticks heredados.
user3439894
@ user3439894 cambió la redacción. Tienes razón sobre el código. Escribí esto en 2011, poco después de que obtuve una Mac, y ha funcionado desde entonces, y no la he mirado desde entonces. Las variables no utilizadas probablemente se hayan quedado de la prueba.
Milliways
3

Aquí está mi opinión sobre esto.

agregue y cargue esta función a su perfil.

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

Actualizar.

builtin cd Usé la línea que se muestra en la respuesta @klanomath que le permite anular el comando cd. Entonces ahora podemos usar:

cd /path/to/example-alias

o

cd /path/to/example

La función debería regresar y cd a la ruta original de los alias originales o la ruta normal.

Markhunte
fuente
1

Mientras que un enlace simbólico (alias UNIX) se ve igual que un alias Finder dentro de Finder, son dos tipos diferentes de alias.

Un enlace simbólico solo mantendrá el camino al que conduce y se romperá de forma permanente o temporal si el recurso se mueve o se encuentra en una unidad desconectada o compartida, respectivamente.

Un alias del Finder es técnicamente un archivo ordinario con instrucciones para el Finder. El Finder puede usar esta información para localizar un archivo / directorio de destino movido hasta cierto punto. Si un recurso objetivo de un alias está en un punto compartido de red montado, también contiene información sobre qué elemento de Llavero usar para iniciar sesión en el punto compartido para abrirlo.

Entonces, a menos que escriba un script o programa para leer el archivo de alias Finder, no lo usará como un directorio, sino como un archivo en la Terminal.

Alternativamente, puede eliminar el alias actual del Finder y crear un enlace simbólico en su lugar. El comando sería ln -s /path/to/originalcrear un enlace simbólico en el directorio actual. La ruta puede ser una ruta completa o relativa.

Fénix
fuente
1
  1. El applecript de @ markhunte funcionó, pero había un mensaje de advertencia: osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)

Con la ayuda de este consejo , modifiqué el applecript de @ markunte para eliminar el mensaje de advertencia anterior

  1. El applecript de @ markhunte es un poco lento porque siempre invoca el applecript. Entonces, siguiendo el consejo de @klanomath que se enumera arriba, modifiqué el script para invocar el applecript solo cuando el objeto de destino es 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
fuente
-2

Como la mayoría de los sistemas operativos (además de Windows), OS X admite scripts Bash. Primero cree el archivo en su escritorio (o la ubicación que desee):

toque ~ / Desktop / PlexConnect.sh A continuación, configure los permisos del archivo de modo que sea ejecutable:

chmod + x ~ / Desktop / PlexConnect.sh A continuación, puede editar el contenido de la secuencia de comandos con el editor de texto de su elección, solo asegúrese de que comience con la siguiente línea para que el sistema sepa ejecutarlo utilizando el shell (Bash):

! / bin / bash

Luego se puede hacer doble clic en el archivo, iniciando Terminal y ejecutándolo.

Sin embargo, una solución más elegante para esto puede ser crear una aplicación AppleScript que ejecute el comando por usted. Abra la aplicación "Editor de secuencias de comandos" y pegue lo siguiente:

hacer el script de shell "/Applications/PlexConnect-master/PlexConnect.py" con privilegios de administrador Guarde esto como una "Aplicación", nombrándolo como desee. Al abrirlo, le dará el mensaje de contraseña estándar de OS X, ejecutará el script y luego se cerrará.

Beautyepic
fuente
¿Cómo responde esto a la pregunta que se hace en la parte superior? Mientras aclaras, ¿puedes arreglar también el formato de tu publicación?
nohillside
¿Qué tiene esto que ver con los alias que se le preguntó por la cuestión también formatee su respuesta como se describe en el Centro de asistencia apple.stackexchange.com/help/formatting
user151019