Как перейти на псевдоним из терминала?

9

Под псевдонимом я имею в виду ярлык папки, созданный, когда вы щелкаете правой кнопкой мыши папку в Finder и выбираете «Сделать псевдоним». Я могу пройти через символические ссылки в терминале с cd, но он не работает на псевдонимами: bash: cd: example-alias: Not a directory. Можно ли изменить каталог на место назначения псевдонима в Терминале?

Стивен
источник
Я обновил свой ответ
markhunte

Ответы:

5

Чтобы включить cd'ing в псевдоним папки, я нашел следующее в Mac OS X Hints .

Скомпилируйте исходный код ниже с помощью следующей команды:

gcc -o getTrueName -framework Carbon getTrueName.c

Это создаст исполняемый файл getTrueName в том же каталоге, что и исходный код. Вы можете добавить его в свой путь или просто скопировать его непосредственно в / usr / bin или / usr / local / bin, чтобы к нему было легко получить доступ.

Исходный код C для getTrueName (скопируйте текст и сохраните файл как getTrueName.c в вашем домашнем каталоге):

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

Включите следующее в ~ / .bash_profile или создайте новый файл ~ / .bash_profile со следующим содержимым:

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
}

Возможно, вам придется перезапустить терминал, чтобы загрузить ваш модифицированный файл .bash_profile.

Протестировано в Yosemite 10.10.2 & gcc 4.2 (Xcode 6.2) и все работает.

Аналогичный подход доступен на superuser.com

klanomath
источник
3

Я не проверял ответ @klanomath, но раньше была библиотека Python для получения цели псевдонима, но поддержка Carbon была удалена из фреймворков Apple. Это можно сделать в Задаче C, см. Https://stackoverflow.com/a/21151368/838253 .

Лучше всего использовать символические ссылки, но, к сожалению, Finder не позволяет их создавать.

Я написал OS X Service, которая создает символические ссылки (которые поддерживаются как Finder, так и Terminal). Это запускает следующий скрипт bash в рабочем процессе Finder. (К сожалению, кажется невозможным опубликовать код Automator в читаемом формате).

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
источник
1
В одном предложении вы говорите: «Лучше всего использовать символические ссылки, но, к сожалению, Finder не поддерживает это». и затем скажите «... который создает символические ссылки (которые поддерживаются как Finder, так и Терминалом)», и они кажутся противоречащими друг другу, поэтому рассмотрите возможность переписать его как «Finder не поддерживает это» , амбициозно. Кроме того , curFolderи linkFileпеременные не используются , так почему они там? Вокруг оператора сравнения должны быть пробелы, например, $fileExists == ""и рассмотреть возможность использования $(..)вместо устаревших обратных символов.
user3439894
@ user3439894 изменил формулировку. Вы правы насчет кода. Я написал это в 2011 году, вскоре после того, как приобрел Mac, и с тех пор он работает, и с тех пор я на него не смотрел. Неиспользованные переменные, вероятно, остались от тестирования.
Милливей
3

Вот мой взгляд на это.

добавьте и загрузите эту функцию в свой .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";
}

Обновить.

Я использовал builtin cd строку, показанную в ответе @klanomath, которая позволяет вам переопределить команду cd. Теперь мы можем использовать:

cd /path/to/example-alias

или

cd /path/to/example

Функция должна вернуть и перейти к исходному пути исходного или псевдонима обычного пути.

markhunte
источник
1

Хотя символическая ссылка (псевдоним UNIX) выглядит так же, как псевдоним Finder в Finder, они представляют собой два полных различных типа псевдонимов.

Символьная ссылка будет содержать только путь, по которому она ведет, и будет постоянно или временно прервана, если ресурс будет перемещен или находится на отключенном диске или общем ресурсе, соответственно.

Псевдоним Finder - технически обычный файл с инструкциями для Finder. Средство поиска может использовать эту информацию, чтобы найти перемещенный целевой файл / каталог в определенной степени. Если целевой ресурс псевдонима находится в подключенной точке общего доступа к сети, он также содержит информацию о том, какой элемент цепочки для ключей использовать для входа на точку общего доступа, чтобы открыть его.

Таким образом, если вы не напишите скрипт или программу для считывания файла псевдонимов Finder, он будет использовать его не как каталог, а как файл в терминале.

Кроме того, вы можете удалить текущий псевдоним Finder и создать вместо него символическую ссылку. Команда должна была ln -s /path/to/originalбы создать символическую ссылку в текущем каталоге. Путь может быть полным или относительным путем.

Феникс
источник
1
  1. Яблочный скрипт @ markhunte работал, но было предупреждение: osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)

При помощи этого наконечника , я изменил @ markunte - х AppleScript , чтобы удалить выше предупреждающее сообщение

  1. Яблочный скрипт @ markhunte немного медленный, потому что он всегда вызывает appleScript. Поэтому, следуя совету @ klanomath, который указан выше, я изменил скрипт, чтобы вызывать appleScript только тогда, когда целевой объект является псевдонимом.
# 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
источник
-2

Как и большинство других операционных систем (кроме Windows), OS X поддерживает скрипты Bash. Сначала создайте файл на рабочем столе (или в любом другом месте):

Нажмите ~ / Desktop / PlexConnect.sh Затем установите права доступа к файлу так, чтобы он был исполняемым:

chmod + x ~ / Desktop / PlexConnect.sh Затем вы можете отредактировать содержимое скрипта с помощью вашего текстового редактора, просто убедитесь, что он начинается со следующей строки, чтобы система знала, что он должен запускаться с использованием оболочки (Bash):

! / Bin / Баш

Затем можно дважды щелкнуть файл, запустить терминал и выполнить его.

Однако более элегантным решением для этого может быть создание приложения AppleScript, которое запускает команду для вас. Откройте приложение «Редактор скриптов» и вставьте следующее:

Выполните сценарий оболочки "/Applications/PlexConnect-master/PlexConnect.py" с правами администратора. Сохраните его как «Приложение», назвав его как хотите. При его открытии вы получите стандартную подсказку пароля OS X, выполните сценарий и закроете себя.

Beautyepic
источник
Как это отвечает на вопрос, заданный сверху? При уточнении, не могли бы вы также исправить форматирование вашего сообщения?
холме
Как это связано с псевдонимами, заданными
user151019