Como ir para o alias do terminal?


9

Por alias, quero dizer o atalho da pasta criado quando você clica com o botão direito do mouse em uma pasta no Finder e seleciona "Criar alias". Eu posso atravessar links simbólicos no Terminal com cd, mas não funciona em aliases: bash: cd: example-alias: Not a directory. É possível alterar o diretório para o destino de um alias no Terminal?


Atualizei minha resposta
markhunte

Respostas:


5

Para ativar o cd'ing em um alias de pasta, encontrei o seguinte no Mac OS X Hints .

Compile o código-fonte abaixo com o seguinte comando:

gcc -o getTrueName -framework Carbon getTrueName.c

Isso criará o executável 'getTrueName' no mesmo diretório que a origem. Você pode adicioná-lo ao seu PATH ou simplesmente copiá-lo diretamente para / usr / bin ou / usr / local / bin, para facilitar o acesso.

Código-fonte C para getTrueName (copie o texto e salve o arquivo como getTrueName.c no diretório inicial):

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

Inclua o seguinte em ~ / .bash_profile ou crie um novo arquivo ~ / .bash_profile com o seguinte conteúdo:

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
}

Você provavelmente precisará reiniciar o Terminal para carregar o .bash_profile modificado.

Testado no Yosemite 10.10.2 e gcc 4.2 (Xcode 6.2) e funciona.

Uma abordagem semelhante está disponível em superuser.com


3

Não testei a resposta do @klanomath, mas costumava haver uma biblioteca Python para obter o alvo de um alias, mas o suporte ao Carbon foi removido das estruturas da Apple. Isso pode ser feito no Objetivo C, consulte https://stackoverflow.com/a/21151368/838253 .

A melhor aposta é usar links simbólicos, mas infelizmente o Finder não permite que você os crie.

Eu escrevi um serviço OS X que cria links simbólicos (suportados pelo Finder e pelo Terminal). Isso executa o seguinte script bash em um fluxo de trabalho do Finder. (Infelizmente, não parece possível postar o código do Automator em um formato legível).

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
Em uma frase, você diz "A melhor aposta é usar links simbólicos, mas infelizmente o Finder não suporta isso". e depois diga "... que cria links simbólicos (que são suportados pelo Finder e pelo Terminal)" e estes parecem contradizer um ao outro, então considere reformulá-lo, pois "O Finder não suporta isso" é ambicioso. Além disso, as variáveis curFoldere linkFilenão são utilizadas. Por que elas estão lá? Deve haver espaços em torno do operador de comparação, por exemplo, $fileExists == ""e considere o uso em $(..)vez de backticks herdados.
usar o seguinte comando

@ user3439894 texto alterado. Você está correto sobre o código. Escrevi isso em 2011, logo após ter adquirido um Mac, que funcionou desde então e não o olho desde então. As variáveis ​​não utilizadas provavelmente são deixadas de lado nos testes.
Milliways

3

Aqui está minha opinião sobre isso.

adicione e carregue esta função no seu .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";
}

Atualizar.

Eu usei a builtin cd linha mostrada na resposta @klanomath, que permite substituir o comando cd. Então agora podemos usar:

cd /path/to/example-alias

ou

cd /path/to/example

A função deve retornar e cd para o caminho original do alias original ou o caminho normal.


1

Embora um link simbólico (alias do UNIX) tenha a mesma aparência de um alias do Finder no Finder, eles são dois tipos diferentes de alias.

Um link simbólico manterá apenas o caminho que leva e será interrompido permanente ou temporariamente se o recurso for movido ou em uma unidade ou compartilhamento desconectado, respectivamente.

Um alias do Finder é tecnicamente um arquivo comum com instruções para o Finder. O Finder pode usar essas informações para localizar um arquivo / diretório de destino movido até um certo ponto. Se um recurso de destino de um alias estiver em um ponto de compartilhamento de rede montado, ele também reterá informações sobre qual item de Chaveiro usar para fazer logon no ponto de compartilhamento e abri-lo.

Portanto, a menos que você escreva um script ou programa para ler o arquivo de alias do Finder, ele não será usado como diretório, mas como arquivo no Terminal.

Como alternativa, você pode remover o alias atual do Finder e criar um link simbólico em seu lugar. O comando seria ln -s /path/to/originalcriar um link simbólico no diretório atual. O caminho pode ser um caminho completo ou relativo.


1
  1. O AppleScript de @ markhunte funcionou, mas havia uma mensagem de aviso: osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)

Com a ajuda desta dica , modifiquei o applecript de @ markunte para remover a mensagem de aviso acima

  1. O AppleScript de @ markhunte é um pouco lento porque sempre invoca o AppleScript. Então, seguindo a dica de @ klanomath, que está listada acima, modifiquei o script para invocar o AppleScript apenas quando o objeto de destino é 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

Como a maioria dos sistemas operacionais (além do Windows), o OS X suporta scripts Bash. Primeiro, crie o arquivo na sua área de trabalho (ou em qualquer local que você queira):

toque em ~ / Desktop / PlexConnect.sh Em seguida, defina as permissões do arquivo para que ele seja executável:

chmod + x ~ / Desktop / PlexConnect.sh Você pode editar o conteúdo do script com o editor de texto de sua escolha, apenas verifique se ele começa com a seguinte linha para que o sistema saiba executá-lo usando o shell (Bash):

! / bin / bash

O arquivo pode ser clicado duas vezes, iniciando o Terminal e executando-o.

Uma solução mais elegante para isso, no entanto, pode ser criar um aplicativo AppleScript que execute o comando para você. Abra o aplicativo "Script Editor" e cole o seguinte:

faça o shell script "/Applications/PlexConnect-master/PlexConnect.py" com privilégios de administrador Salve isso como um "Aplicativo", nomeando-o como desejar. Ao abri-lo, ele fornecerá o prompt de senha padrão do OS X, executará o script e depois se fechará.


Como isso responde à pergunta feita no topo? Ao esclarecer, você também pode corrigir a formatação de sua postagem?
nohillside

O que isso tem a ver com aliases, conforme solicitado na pergunta Também formate sua resposta conforme descrito na Central de Ajuda apple.stackexchange.com/help/formatting
user151019
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.