터미널에서 별칭으로 이동하는 방법?


9

별명으로, Finder에서 폴더를 마우스 오른쪽 버튼으로 클릭하고 "별칭으로 만들기"를 선택하면 생성 된 폴더 바로 가기를 의미합니다. 와 함께 터미널에서 심볼릭 링크를 통과 할 수 cd있지만 별칭에서는 작동하지 않습니다 bash: cd: example-alias: Not a directory. 터미널에서 디렉토리를 별칭의 대상으로 변경할 수 있습니까?


답변을 업데이트했습니다
markhunte

답변:


5

폴더 별명으로 cd를 활성화하려면 Mac OS X Hints 에서 다음을 발견했습니다 .

다음 명령을 사용하여 아래 소스 코드를 컴파일하십시오.

gcc -o getTrueName -framework Carbon getTrueName.c

소스와 같은 디렉토리에 'getTrueName'실행 파일이 생성됩니다. PATH에 추가하거나 / usr / bin 또는 / usr / local / bin에 직접 복사하면 쉽게 액세스 할 수 있습니다.

getTrueName에 대한 C 소스 코드 (텍스트를 복사하고 파일을 홈 디렉토리에 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 에서도 비슷한 방법을 사용할 수 있습니다


3

@klanomath의 답변을 테스트하지는 않았지만 별칭의 대상을 얻기 위해 Python 라이브러리가 있었지만 Carbon 지원은 Apple 프레임 워크에서 제거되었습니다. Objective C에서 https://stackoverflow.com/a/21151368/838253을 참조 하십시오 .

가장 좋은 방법은 심볼릭 링크를 사용하는 것이지만 불행히도 Finder에서는 심볼릭 링크를 만들 수 없습니다.

심볼릭 링크를 만드는 OS X 서비스를 작성했습니다 (Finder와 터미널 모두에서 지원됨). Finder 워크 플로우에서 다음 bash 스크립트를 실행합니다. 불행히도 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는이를 지원하지 않습니다."라고 말합니다. 그런 다음 "... symlinks (Finder와 Terminal 모두에서 지원됨)를 생성합니다." 라고 말하면 서로 상충되는 것처럼 보이므로 "Finder가 지원하지 않습니다" 는 야심 찬 단어로 바꾸십시오 . 또한 curFolderlinkFile변수가 사용되지 않으므로 왜 거기에 있습니까? 예를 들어 비교 연산자 주위에 공백이 있어야하며 레거시 백틱 대신에 $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 answer에 표시된 줄을 사용하여 cd 명령을 무시할 수 있습니다. 이제 다음을 사용할 수 있습니다.

cd /path/to/example-alias

또는

cd /path/to/example

이 함수는 별칭의 원래 경로 또는 원래 경로로 돌아가서 cd해야합니다.


1

기호 링크 (UNIX 별명)는 Finder 내의 Finder 별명과 동일하게 보이지만 서로 다른 두 가지 별명 유형입니다.

심볼릭 링크는 리소스가 이동하거나 연결이 끊어진 드라이브 나 공유에서 각각 연결되는 경로 만 유지하며 영구적으로 또는 일시적으로 끊어집니다.

Finder 별명은 기술적으로 Finder에 대한 지시 사항이있는 일반 파일입니다. Finder는이 정보를 사용하여 이동 된 대상 파일 / 디렉토리를 어느 정도 찾을 수 있습니다. 별칭의 대상 리소스가 탑재 된 네트워크 공유 지점에있는 경우 공유 키를 열 때 공유 지점에 로그인하는 데 사용할 키 체인 항목에 대한 정보도 보유합니다.

따라서 Finder 별명 파일을 읽기 위해 스크립트 또는 프로그램을 작성하지 않으면 디렉토리로 사용되지 않고 터미널의 파일로 사용됩니다.

또는 현재 Finder 별명을 제거하고 대신 기호 링크를 작성할 수 있습니다. ln -s /path/to/original현재 디렉토리에 심볼릭 링크를 만드는 것이 명령입니다 . 경로는 전체 또는 상대 경로 일 수 있습니다.


1
  1. @markhunte의 applescript는 효과가 있었지만 경고 메시지가있었습니다 : 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는 항상 applescript를 호출하기 때문에 약간 느립니다. 따라서 위에 나열된 @klanomath의 팁에 따라 대상 객체가 별칭 인 경우에만 애플 스크립트를 호출하도록 스크립트를 수정했습니다.
# 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

대부분의 운영 체제 (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
user151019
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.