Saya ingin membuat alias, yang menjalankan program x, tanpa mengubah direktori saya saat ini. Apa yang saya miliki sekarang adalah:
alias x = "cd /home/path_to_x && ./x"
Ini berfungsi, tetapi mengubah direktori saya. Yang ingin saya lakukan adalah sesuatu seperti:
alias x="./home/path_to_x/x
Tetapi kemudian saya tidak mendapatkan file atau direktori tersebut. Adakah yang tahu solusi untuk ini?
command-line
alias
Pemancing
sumber
sumber
alias x='/home/path_to_x/x'
. Jangan gunakan.
sebelumnya/home
..
(dot) merujuk ke direktori saat ini.x
benar-benar perlu dijalankan saat berada di/home/path_to_x
? Atau apakah Anda hanya tidak yakin tentang cara menjalankan program yang berada di direktori tertentu?Jawaban:
JANGAN CD, jalankan saja menggunakan jalur absolutnya
Versi ini:
mengubah direktori ke jalur absolut (Anda melihat bagaimana
/home/...
memulai di direktori root) dan kemudian menjalankan executable di jalur relatif./x
(yaitu, relatif terhadap direktori kerja baru).Versi ini:
mencoba menjalankan executable di path relatif
./home/path_to_x/x
, yang berarti relatif terhadap apa pun direktori kerja Anda saat ini sekarang . Itu menjelaskan mengapa Anda mendapatkan kesalahan - jalur relatif ini benar-benar tidak ada.Perintah yang Anda inginkan adalah:
menggunakan path absolut (mulai dari direktori root
/
) lagi.Oh, dan Anda juga bisa menambahkan
/home/path_to_x
kePATH
bukan mengganti alias. Lihat: Bagaimana menjalankan skrip tanpa mengetik path lengkap?sumber
pwd
/home/path_to_x/x
secara fungsional tidak setara dengan(cd /home/path_to_x && ./x)
; apakah itu berfungsi atau tidak tergantung aplikasi.Jika Anda tidak ingin
cd
menempel setelah penggantian alias, gunakan subkulit dengan(
y)
:Anda dapat memeriksanya
Perhatikan solusinya
tidak persis sama. Bahkan, jika dipanggil via
my_x
,x
program dijalankan dengan direktori saat ini/home/path_to_x/
, sedangkan jika dipanggil olehmy_y
,x
dijalankan dengan direktori saat ini yang merupakan tempat di mana perintahmy_y
itu dikeluarkan. Ini bisa penting atau tidak tergantung pada apax
yang dilakukan.Tentang solusi OP , ia bekerja di
bash
:tapi tidak di
zsh
:Tampaknya bash dan zsh mengeksekusi daftar dengan cara yang berbeda ... jadi lebih baik menambahkan tanda kurung eksplisit ... terima kasih @EliahKagan karena menunjukkannya kepada saya.
sumber
&
prioritas yang lebih tinggi daripada yang&&
tampaknya unik untukzsh
. Aku mencobasleep 5 && echo done &
dizsh
,bash
,ksh
,mksh
,dash
, dan bahkan satu non-Bourne-gaya shell (tcsh
). Hanyazsh
dievaluasisleep 5
di latar depan; semua yang lain segera kembali (kemudian dicetakdone
lima detik kemudian, tentu saja). Di sisi lain, bahkan jika ini sepenuhnya merupakan kekhasanzsh
, saya pikir menambahkan eksplisit( )
(atau{ ;}
) masuk akal, karena menyampaikan maksud untuk manusia lain (atau untuk diri sendiri, ketika membaca skrip atau sejarah nanti).Jika file yang ingin Anda jalankan sudah dapat dieksekusi, mengapa Anda tidak menambahkannya ke variabel PATH Anda?
Jika file yang dapat dieksekusi Anda
/home/user/aplication/appX
cukup masukkanuntuk Anda
~/.bashrc
atau~/.profile
Setelah memulai ulang konsol Anda, Anda dapat menjalankannya hanya dengan
appX
Saya pikir ini adalah solusi paling bersih.
sumber
Meletakkan
&
di bagian akhir tampaknya melakukan trik:sumber
x
Anda berada di/home/path_to_x
. Yang&
pada akhirnya hanya mengirim proses di latar belakang.cd
s di pekerjaan latar belakang tidak mempengaruhi penelepon (yang masuk akal - itu akan sangat aneh jika mereka lakukan). Ini karena eksekusi asinkron menggunakan subkulit . Meskipun ini akan lebih baik jika itu menjelaskan mengapa ia bekerja dan apa yang&
- dan bagaimana menjalankan di latar belakang kadang-kadang tidak diinginkan - ini (sudah) jawaban yang benar. ( Secara eksplisit membuat subkulit dengan( )
sintaksis, seperti yang Anda sarankan , mungkin merupakan solusi yang lebih baik sebagian besar waktu.)zsh
efektif dan tidak bekerjabash
dalamzsh
... pasti ada perbedaan dalam bagaimana alias diperluas.pushd
dizsh
(saya punyasetopt autopushd pushdsilent pushdtohome
, dan ia mengingat cwd saya.)Dapatkan Cadangan pwd Anda saat ini dan dan setelah menjalankan perintah Anda, batalkan pwd terakhir Anda.
sumber
test
) mendorong kursor ke baris berikutnya. Anda masih dapat melakukan apa pun yang Anda inginkan di sana (termasuk menekan enter untuk membuka prompt baru yang baru).pushd
danpopd
lakukan apa jawaban Anda.alias x='pushd /home/path_to_x && ./x && popd'