Bagaimana cara pergi ke alias dari terminal?

9

Dengan alias, maksud saya pintasan folder dibuat ketika Anda mengklik kanan folder di Finder dan pilih "Make Alias". Saya dapat melintasi link simbolik di Terminal dengan cd, tetapi tidak bekerja pada alias: bash: cd: example-alias: Not a directory. Apakah mungkin untuk mengubah direktori ke tujuan alias di Terminal?

Steven
sumber
Saya telah memperbarui jawaban saya
markhunte

Jawaban:

5

Untuk mengaktifkan cd'ing ke folder alias saya telah menemukan yang berikut di Mac OS X Petunjuk .

Kompilasi kode sumber di bawah ini dengan perintah berikut:

gcc -o getTrueName -framework Carbon getTrueName.c

Ini akan membuat executable 'getTrueName' di direktori yang sama dengan sumbernya. Anda dapat menambahkannya ke PATH Anda, atau cukup salin langsung ke / usr / bin atau / usr / local / bin sehingga mudah diakses.

Kode sumber C untuk getTrueName (salin teks dan simpan file sebagai getTrueName.c di direktori home Anda):

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

Sertakan berikut ini di ~ / .bash_profile atau buat file baru ~ / .bash_profile dengan konten berikut:

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
}

Anda mungkin harus memulai ulang Terminal untuk memuat .bash_profile Anda yang dimodifikasi.

Diuji dalam Yosemite 10.10.2 & gcc 4.2 (Xcode 6.2) dan berhasil.

Pendekatan serupa tersedia di superuser.com

klanomath
sumber
3

Saya belum menguji jawabannya oleh @klanomath, tetapi dulu ada perpustakaan Python untuk mendapatkan target alias, tetapi dukungan Carbon telah dihapus dari kerangka kerja Apple. Ini dapat dilakukan di Objective C, lihat https://stackoverflow.com/a/21151368/838253 .

Taruhan terbaik adalah dengan menggunakan symlink, tetapi sayangnya Finder tidak memungkinkan Anda untuk membuatnya.

Saya telah menulis Layanan OS X yang membuat symlink (yang didukung oleh Finder dan Terminal). Ini menjalankan skrip bash berikut dalam alur kerja Finder. (Sayangnya sepertinya tidak mungkin untuk memposting kode Automator dalam format yang dapat dibaca).

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
sumber
1
Dalam satu kalimat Anda mengatakan "Taruhan terbaik adalah menggunakan symlink, tetapi sayangnya Finder tidak mendukung ini." dan kemudian mengatakan "... yang membuat symlink (yang didukung oleh Finder dan Terminal)" dan ini tampaknya saling bertentangan, jadi pertimbangkan untuk menulis ulang sebagai "Finder tidak mendukung ini" adalah ambisius. Juga variabel curFolderdan linkFiletidak digunakan jadi mengapa mereka ada di sana? Harus ada ruang di sekitar operator pembanding misalnya $fileExists == ""dan pertimbangkan untuk menggunakan $(..)backtick bukan warisan
user3439894
@ user3439894 mengubah kata-kata. Anda benar tentang kode tersebut. Saya menulis ini pada tahun 2011, tak lama setelah saya mendapatkan Mac, dan itu telah bekerja sejak itu, dan saya belum melihatnya sejak itu. Variabel yang tidak digunakan mungkin tersisa dari pengujian.
Milliways,
3

Inilah pendapat saya tentang ini.

tambahkan dan muat fungsi ini ke profil Anda.

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

Memperbarui.

Saya menggunakan builtin cd baris yang ditunjukkan pada jawaban @klanomath yang memungkinkan Anda untuk menimpa perintah cd. Jadi sekarang kita dapat menggunakan:

cd /path/to/example-alias

atau

cd /path/to/example

Fungsi harus mengembalikan dan cd ke jalur asli alias asli atau jalur normal.

markhunte
sumber
1

Sementara tautan simbolik (alias UNIX) terlihat sama dengan Finder alias di dalam Finder, keduanya adalah dua jenis alias yang berbeda.

Tautan simbolis hanya akan menahan jalur yang dipimpinnya dan secara permanen atau sementara akan putus jika sumber daya dipindahkan atau pada drive yang terputus atau berbagi masing-masing.

Alias ​​Finder secara teknis file biasa dengan instruksi untuk Finder. Finder dapat menggunakan informasi ini untuk menemukan file / direktori target yang dipindahkan sampai batas tertentu. Jika sumber daya target alias ada di titik berbagi jaringan yang terpasang, ia juga menyimpan informasi tentang item Keychain yang akan digunakan untuk masuk Anda ke titik berbagi untuk membukanya.

Jadi, kecuali Anda menulis skrip atau program untuk membacakan file alias Finder, itu tidak akan menggunakannya sebagai direktori, tetapi sebagai file di Terminal.

Atau, Anda dapat menghapus alias Finder saat ini dan membuat tautan simbolik sebagai gantinya. Perintahnya adalah ln -s /path/to/originalmembuat tautan simbolik di direktori saat ini. Path bisa berupa path penuh atau relatif.

Phoenix
sumber
1
  1. @ Markhunte's applescript bekerja, tetapi ada pesan peringatan: osascript[9807:7154723] CFURLGetFSRef was passed an URL which has no scheme (the URL will not work with other CFURL routines)

Dengan bantuan tip ini , saya memodifikasi applescript @ markunte untuk menghapus pesan peringatan di atas

  1. @ markhunte's applescript sedikit lambat karena selalu memanggil applescript. Jadi berikut tip @ klanomath yang tercantum di atas, saya memodifikasi script untuk memanggil applescript hanya ketika objek target 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
}
znam
sumber
-2

Seperti kebanyakan sistem operasi (selain Windows), OS X mendukung skrip Bash. Pertama-tama buat file di Desktop Anda (atau lokasi apa pun yang Anda inginkan):

sentuh ~ / Desktop / PlexConnect.sh Selanjutnya, atur izin file sedemikian rupa sehingga dapat dieksekusi:

chmod + x ~ / Desktop / PlexConnect.sh Anda kemudian dapat mengedit konten skrip dengan editor teks pilihan Anda, pastikan itu dimulai dengan baris berikut sehingga sistem tahu untuk menjalankannya menggunakan shell (Bash):

! / bin / bash

File kemudian dapat diklik dua kali, meluncurkan Terminal dan menjalankannya.

Namun, solusi yang lebih elegan untuk ini adalah membuat aplikasi AppleScript yang menjalankan perintah untuk Anda. Buka aplikasi "Editor Skrip" dan rekatkan pada yang berikut:

do script script "/Applications/PlexConnect-master/PlexConnect.py" dengan hak administrator Simpan ini sebagai "Aplikasi," beri nama apa pun yang Anda inginkan. Saat membukanya, ia akan memberi Anda prompt kata sandi standar OS X, menjalankan skrip, lalu menutup sendiri.

Beautyepic
sumber
Bagaimana ini menjawab pertanyaan yang diajukan di atas? Sambil menjelaskan, bisakah Anda juga memperbaiki pemformatan pos Anda?
nohillside
Apa yang memiliki ini harus dilakukan dengan alias seperti yang diminta dalam pertanyaan Juga harap format jawaban Anda seperti yang dijelaskan di Pusat Bantuan apple.stackexchange.com/help/formatting
user151019