Jalankan program dari mana saja tanpa mengubah direktori

9

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?

Pemancing
sumber
9
atur alias alias x='/home/path_to_x/x'. Jangan gunakan .sebelumnya /home. .(dot) merujuk ke direktori saat ini.
souravc
2
Apakah xbenar-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?
Adaephon
Satu lagi pertanyaan serupa askubuntu.com/questions/427818/…
c0rp

Jawaban:

13

JANGAN CD, jalankan saja menggunakan jalur absolutnya

Versi ini:

cd /home/path_to_x && ./x

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:

./home/path_to_x/x

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:

/home/path_to_x/x

menggunakan path absolut (mulai dari direktori root /) lagi.

Oh, dan Anda juga bisa menambahkan /home/path_to_xke PATHbukan mengganti alias. Lihat: Bagaimana menjalankan skrip tanpa mengetik path lengkap?

Tak berguna
sumber
Ini adalah jawaban yang benar untuk pertanyaan yang diajukan.
Dijeda sampai pemberitahuan lebih lanjut.
1
Ini hanya akan salah jika program perlu dijalankan dalam direktori spesifik yang didapatnyapwd
Kaz Wolfe
@Whaaaaaat benar. /home/path_to_x/xsecara fungsional tidak setara dengan (cd /home/path_to_x && ./x); apakah itu berfungsi atau tidak tergantung aplikasi.
Rmano
Meskipun secara umum Anda benar, untuk pertanyaan khusus ini OP tampak berusaha lari dari jalur absolut (hanya dengan kesalahan satu karakter). Namun, saya yakin mereka dapat mengklarifikasi jika direktori kerja penting dalam kasus ini.
berguna
8

Jika Anda tidak ingin cdmenempel setelah penggantian alias, gunakan subkulit dengan (y ):

alias my_x="(cd /home/path_to_x && ./x)&" 

Anda dapat memeriksanya

alias test_y="(cd /tmp && sleep 10 ) & "

Perhatikan solusinya

alias my_y="/home/path_to_x/x" 

tidak persis sama. Bahkan, jika dipanggil via my_x, xprogram dijalankan dengan direktori saat ini /home/path_to_x/, sedangkan jika dipanggil oleh my_y, xdijalankan dengan direktori saat ini yang merupakan tempat di mana perintah my_yitu dikeluarkan. Ini bisa penting atau tidak tergantung pada apa xyang dilakukan.

Tentang solusi OP , ia bekerja di bash:

romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null  &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano

tapi tidak di zsh:

[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1]  + 16744 done       ./echo A > /dev/null                                    
1& [romano:/bin] % pwd
/bin
[romano:/bin] % 

Tampaknya bash dan zsh mengeksekusi daftar dengan cara yang berbeda ... jadi lebih baik menambahkan tanda kurung eksplisit ... terima kasih @EliahKagan karena menunjukkannya kepada saya.

Rmano
sumber
1
Memberikan &prioritas yang lebih tinggi daripada yang &&tampaknya unik untuk zsh. Aku mencoba sleep 5 && echo done &di zsh, bash, ksh, mksh, dash, dan bahkan satu non-Bourne-gaya shell ( tcsh). Hanya zshdievaluasi sleep 5di latar depan; semua yang lain segera kembali (kemudian dicetak donelima detik kemudian, tentu saja). Di sisi lain, bahkan jika ini sepenuhnya merupakan kekhasan zsh, saya pikir menambahkan eksplisit ( )(atau { ;}) masuk akal, karena menyampaikan maksud untuk manusia lain (atau untuk diri sendiri, ketika membaca skrip atau sejarah nanti).
Elia Kagan
4

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/appXcukup masukkan

PATH=$PATH:/home/user/application

untuk Anda ~/.bashrcatau~/.profile

Setelah memulai ulang konsol Anda, Anda dapat menjalankannya hanya dengan appX

Saya pikir ini adalah solusi paling bersih.

0xAffe
sumber
3

Meletakkan &di bagian akhir tampaknya melakukan trik:

alias x = "cd /home/path_to_x && ./x &"
Pemancing
sumber
2
Apakah kamu yakin Setelah mengeksekusi xAnda berada di /home/path_to_x. Yang &pada akhirnya hanya mengirim proses di latar belakang.
Rmano
2
@Rmano Ini benar-benar berfungsi. cds 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.)
Eliah Kagan
@ ElliKagan kamu benar. Saya memeriksa solusinya dengan zshefektif dan tidak bekerja bashdalam zsh... pasti ada perbedaan dalam bagaimana alias diperluas.
Rmano
Mengajukan
Rmano
@Rmano melakukan Anda mengaktifkan pengaturan yang terkait dengan pushddi zsh(saya punya setopt autopushd pushdsilent pushdtohome, dan ia mengingat cwd saya.)
Muru
0

Dapatkan Cadangan pwd Anda saat ini dan dan setelah menjalankan perintah Anda, batalkan pwd terakhir Anda.

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'
αғsнιη
sumber
Anda salah mengerti efek dari alias Rmano itu. Baris perintah tidak diblokir. Hanya saja output dari alias ( 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).
muru
yup, ya benar. @mure: |
αғsнιη
Perhatikan bahwa karena Anda menggunakan tanda kutip ganda variabel akan memasukkan direktori saat ini pada saat alias didefinisikan . Gunakan tanda kutip tunggal untuk menunda evaluasi sampai alias diperluas. Namun, pushddan popdlakukan apa jawaban Anda. alias x='pushd /home/path_to_x && ./x && popd'
Dijeda sampai pemberitahuan lebih lanjut.