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


9

Під псевдонімом я маю на увазі ярлик папки, створений при натисканні правою кнопкою миші папки у Finder і вибору "Зробити псевдонім". Можу проходити символічні посилання в терміналі cd, але не працює з псевдонімами: bash: cd: example-alias: Not a directory. Чи можна змінити каталог на пункт призначення псевдоніма в терміналі?


Я оновив свою відповідь
markhunte

Відповіді:


4

Щоб увімкнути cd'ing у псевдонім папки, я знайшов наступне Підказки для Mac OS X. .

Скомпілюйте вихідний код нижче за допомогою наступної команди:

gcc -o getTrueName -framework Carbon getTrueName.c

Це створить виконуваний файл "getTrueName" в тому ж каталозі, що й джерело. Ви можете додати його до PATH, або просто скопіювати його безпосередньо в / usr / bin або / usr / local / bin, щоб отримати легкий доступ.

З вихідним кодом для 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
}

Можливо, вам доведеться перезапустити Terminal, щоб завантажити модифікований .bash_profile.

Випробувано в Йосеміті 10.10.2 & amp; gcc 4.2 (Xcode 6.2) і він працює.

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


3

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

Найкраще використовувати символічні посилання, але, на жаль, Finder не дозволяє створювати їх.

Я написав службу OS X, яка створює символічні посилання (які підтримуються як 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

1
У одному реченні ви говорите "Краще всього використовувати символічні посилання, але, на жаль, Finder не підтримує цього". а потім скажіть "... який створює символічні посилання (які підтримуються як Finder, так і Terminal)" і вони, здається, суперечать один одному, тому розглянути її можна як "Finder не підтримує це" є амбітним. Крім того curFolder і linkFile змінні невикористані, так чому вони існують? Необхідно мати пробіли навколо оператора порівняння, наприклад, $fileExists == "" і розглянути можливість використання $(..) замість застарілих зворотів.
user3439894

@ user3439894 змінив формулювання. Ви правильні щодо коду. Я написав це в 2011 році, незабаром після того, як я отримав Mac, і він працював з тих пір, і я не дивився на нього з тих пір. Можливо, невикористані змінні залишилися від тестування.
Milliways

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

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


1

Хоча символічне посилання (псевдонім UNIX) виглядає так само, як псевдонім Finder у Finder, це два повних різних типи псевдонімів.

Символічне посилання буде утримувати лише шлях, до якого він призводить, і буде постійно або тимчасово перерватися, якщо ресурс переміщено або на роз'єднаному диску або відповідно відповідно.

Псевдонім Finder є технічно звичайним файлом з інструкціями для Finder. Finder може використовувати цю інформацію, щоб певною мірою знайти переміщений цільовий файл / каталог. Якщо цільовий ресурс псевдоніма знаходиться на монтованій точці спільного доступу до мережі, він також містить інформацію про те, який елемент Keychain використовувати для входу до точки спільного доступу, щоб відкрити його.

Отже, якщо ви не пишете скрипт або програму для зчитування файлу псевдоніма Finder, воно не буде використовувати його як каталог, а як файл у терміналі.

Крім того, можна видалити поточний псевдонім Finder і створити на його місці символічне посилання. Командування було б ln -s /path/to/original створити символічне посилання в поточному каталозі. Шлях може бути повним або відносним шляхом.


0

Яблука сценарію @ markhunte працювала, але з'явилося попереджувальне повідомлення: osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)

За допомогою цього порада , Я змінив @ markunte's applescript, щоб видалити попереднє повідомлення

function cd  {
  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";
}

-2

Як і більшість операційних систем (окрім Windows), OS X підтримує сценарії Bash. Спочатку створіть файл на робочому столі (або будь-якому іншому місці):

торкніться ~ / Desktop / PlexConnect.sh Далі встановіть дозволи файлу таким чином, щоб він виконувався:

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

! / bin / bash

Потім файл можна двічі натиснути, запустити термінал і виконати його.

Більш елегантним рішенням для цього, однак, може бути створення програми AppleScript, яка виконує команду для вас. Відкрийте програму "Редактор сценаріїв" і вставте наступне:

зробити скрипт оболонки "/Applications/PlexConnect-master/PlexConnect.py" з правами адміністратора Збережіть це як "Програму", назвавши все, що хочете. Відкриваючи його, він надасть вам стандартну підказку для пароля OS X, виконає скрипт, а потім закриється.


Як це відповідає на запитання, що задається зверху? Під час роз'яснення ви можете також виправити форматування вашої публікації?
nohillside

Що це стосується псевдонімів, заданих у запиті. Також відформатуйте відповідь, як описано в довідковому центрі apple.stackexchange.com/help/formatting
Mark
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.