Andaikata saya berada di folder yang sama dengan file yang dapat dieksekusi, saya perlu mengetik ini untuk menjalankannya:
./file
Saya lebih suka tidak perlu mengetik /, karena /sulit bagi saya untuk mengetik.
Apakah ada cara yang lebih mudah untuk mengeksekusi file? Idealnya hanya beberapa sintaks sederhana seperti:
.file
atau sesuatu yang lain tetapi lebih mudah daripada harus memasukkan /karakter di sana.
Mungkin ada beberapa cara untuk meletakkan sesuatu di /bin
direktori, atau membuat alias untuk penerjemah, sehingga saya bisa menggunakan:
p file
filenames
executable
IMSoP
sumber
sumber
/
digunakan secara luas di Unix, sebagian besar sebagai pemisah direktori. Anda mungkin lebih baik menemukan cara yang lebih mudah untuk mengetiknya./
tidak sulit untuk mengetik untuk sebagian besar orang, dan jika OP memiliki cedera yang mencegah hal ini, mereka harus mempertimbangkan tata letak keyboard alternatif, karena tidak ada cara mereka dapat menghindari/
sepenuhnya saat berada di terminal./
shift-7 yang relatif sulit untuk diketik , bahkan tanpa cedera.Jawaban:
Ini bisa "berisiko" tetapi Anda bisa saja melakukannya. di PATH Anda.
Seperti yang telah dikatakan pada orang lain, ini bisa berbahaya jadi selalu pastikan. lebih pada akhir PATH daripada awal.
sumber
cd
ke direktori yang dapat ditulis oleh dunia dan mencoba menggunakan perintah yang tidak ada di jalur Anda, Anda dapat menjalankan (mungkin berbahaya) yang dapat dieksekusi dengan nama yang sama dengan yang ditulis seseorang ke jalur itu. Ini jauh lebih buruk jika Anda meletakkannya.
di awal jalan Anda. Dalam hal itu, eksekusi berbahaya yang dipanggills
akan dieksekusi jika Anda mencoba memanggills
direktori itu.p
perintah akan lebih baik..
awalPATH
, semua yang perlu dilakukan pengguna jahat adalah menjatuhkanls
perintah palsu di direktori mereka dan membujuk admin untuk "melihat sesuatu yang aneh" dan mereka punya akses root.test
, seperti dalam judul pertanyaan (karenatest
ini adalah built-in shell, dan mungkin juga sudah ada di suatu tempat di Anda$PATH
sudah)..
akan secara otomatis melengkapi./
(mengetik.
dan menekan Tab) setidaknya di shell Bash modern, jadi Anda tidak perlu menggunakan solusi yang kompleks atau tidak aman (sepertiPATH
modifikasi).Jika tidak lengkap secara otomatis, Anda mungkin perlu menginstal paket "bash-completion".
sumber
.
memiliki beberapa kandidat penyelesaian:.
(direktori saat ini),..
(direktori induk),.
perintah (yang disediakan bashsource
untuk alias tidak standar ), dan semua dotfile yang ada. Mungkinbash-completion
paket mengabaikan ini; Saya merasa itu sangat menjengkelkan (mis. Membuatnya tidak mungkin untuk melabeli nama dir padamake
baris perintah dan umumnya buruk dengan makefile yang penuh dengan aturan implisit) jadi saya selalu membersihkannya.make
target.Dimungkinkan untuk menulis fungsi seperti itu:
di Anda
~/.bashrc
. Maka Anda akan dapat menjalankanp app arguments
alih-alih./app arguments
. Solusi ini berfungsi untuk jenis apa pun yang dapat dieksekusi, termasuk skrip dan binari."$@"
meluas ke daftar argumen yang dikutip dengan tepat yang diteruskan ke fungsi (mempertahankan semua karakter khusus dari gumpalan atau ekspansi variabel), dan, seperti yang ditunjukkan @Scott,bash
cukup pintar untuk bergantung./
pada yang pertama, menjaga sisanya.sumber
strace -f p app
melihat panggilan sistem dibuat, atau$(which time) p app
untuk melihat berapa lama.p
sebagai skrip yang dapat dieksekusi akan bekerja lebih baik dalam dua contoh spesifik yang saya buat. Tidak ada solusi yang dapat bekerjaldd p app
, meskipunldd
juga berbeda dalam membutuhkan jalur penuh, mungkin karena alasan seperti ini.p app args
dengan./app args
cara yang tidak terlihat oleh siapa pun akan membutuhkan input shell piping melalui semacam preprocessor dan akan menyebabkan segala macam kesenangan ketika penggantian terjadi di tempat yang tidak disengaja :)$@
? Kalau tidak, itu hanya akan melewati satu argumen besar ke program.$@
adalah array. Ketika diperluas dalam"
, setiap parameter diperluas ke kata yang terpisah.$*
berperilaku seperti yang Anda pikirkan.p() { ./"$@"; }
yang Anda butuhkan.Anda dapat menempatkan
.
ke Anda$PATH
dengan menambahkan misalnyaPATH=$PATH:.
ke Anda/etc/profile
, dengan cara ini Anda dapat mengeksekusifile
hanya dengan menulisfile
, kecuali itu ada di folder lain di jalur Anda (misalnya/usr/bin/
). Perhatikan bahwa ini umumnya bukan ide yang baik.Mengapa itu buruk: Katakanlah Anda berada dalam situasi di mana Anda tidak sepenuhnya mempercayai isi direktori - Anda telah mengunduhnya dari suatu tempat yang cerdik dan Anda ingin menyelidikinya sebelum menjalankannya, atau Anda seorang sysadmin membantu beberapa pengguna dengan melihat di direktori home mereka, dll. Anda ingin membuat daftar direktori, jadi Anda mencoba mengetik ls, tetapi oops, Anda membuat kesalahan ketik, dan akhirnya mengetikkan sl. Penulis direktori jahat ini mengantisipasi ini dan meletakkan skrip shell di dalamnya yang disebut "sl" yang menjalankan 'rm -rf --no-preserve-root /' (atau sesuatu yang lebih berbahaya seperti memasang rootkit).
(Terima kasih @Muzer untuk penjelasannya)
sumber
Anda dapat memanggil penerjemah, misalnya
Dalam kasus ini, skrip akan berjalan walaupun tidak memiliki baris shebang (mis.
#!/bin/bash
) Atau bit yang dapat dieksekusi. Anda harus tahu penerjemah yang benar untuk menjalankannya juga. Anda dapat membaca baris shebang dari file terlebih dahulu untuk memastikan Anda memanggil juru bahasa yang benar, misalnya jika baris shebang mengatakankamu akan menelepon
sumber
/lib/ld.so
Sejauh yang saya tahu, tidak ada cara untuk mencapainya kecuali Anda memasukkan file di path env, jadi Anda bisa menjalankannya dengan mengetik saja:
file
.file
tidak akan berfungsi karena itu adalah nama file yang berbeda. Ini adalah file yang dipanggil.file
dan tidak./file
.Saya rasa slash mungkin sulit diketik untuk Anda karena tata letak non-Inggris, mungkin? Dalam hal ini, itu juga terjadi pada saya, jadi saya sering menukar tata letak keyboard saya ke bahasa Inggris dengan menekan Alt + Shift di Windows (saya menggunakan Linux dari ssh)
sumber
Orang-orang telah menyarankan
.
untuk menambahkanPATH
, yang berbahaya karena itu menciptakan risiko bahwa Anda secara tidak sengaja akan menjalankan program jahat yang ditanam di direktori yang dapat ditulis oleh dunia. Tapi, jika Anda memiliki program dieksekusi dalam beberapa direktori yang Anda miliki dan ditulis hanya dengan Anda, maka itu aman (cukup aman?) Untuk menempatkan orang-orang sutradara (ies) ke dalamPATH
, dengan menambahkan baris sepertike
~/.bashrc
file Anda . Tentu saja ini berarti Anda dapat menjalankan program dari salah satu direktori tersebut dari mana saja di sistem file. Misalnya, Anda bisacd /etc
dan mengetikfoo
, dan itu akan berjalan~/dev/myprog1/foo
. Ini memiliki kelemahan kecil yaitu Anda tidak dapat memiliki program dengan nama yang sama di lebih dari satu direktori. Secara khusus, jika Anda memiliki program yang dipanggilfoo
keduanya~/dev/myprog1
dan~/dev/myprog2
, Anda tidak akan dapat menjalankan yang kedua kecuali dengan menentukan jalur. Demikian juga jika Anda memiliki~/dev/myprog1/cat
- tetapi mengapa Anda mau?Pendekatan lain, jika Anda hanya memiliki beberapa program yang Anda lakukan dengan ini, adalah mendefinisikan alias untuk mereka:
Atau Anda dapat memanggil alias
.gizmo
dan.gonzo
jika Anda menemukan itu lebih intuitif.Sebenarnya, ini memiliki, pada tingkat tertentu, risiko keamanan yang sama dengan menempatkan
.
AndaPATH
. Jika pengguna jahat dapat membaca Anda.bashrc
dan melihat alias Anda, maka ia mungkin menempatkan malware yang dipanggilgizmo
dangonzo
di direktori acak dengan harapan Anda akan menjalankannya. Lebih baik membuat ini menggunakan nama path absolut:Omong-omong, Anda harus menghindari penamaan yang dapat dieksekusi
test
, karena itu adalah perintah shell builtin, dan Anda dapat menjalankan program dengan nama itu hanya dengan menentukan lintasan atau trik lain.sumber
make gizmo
ataumake gonzo
.Makefile
di setiap direktori, sehingga tindakan untukmake gizmo
mengakhiri dengan menjalankangizmo
? (1) Itu tampak seperti cara canggung dalam melakukan hal yang sama denganp
fungsi, disarankan dalam pertanyaan, awalnya dilaksanakan oleh aitap , dan disempurnakan oleh Scott. (2) Bisakah Anda memberikan argumen seperti itu? ISTM yangmake gizmo arg1 arg2
setara denganmake gizmo; make arg1; make arg2
../
di setiap direktori . Dalam pikiran saya, dia sedang mengembangkan sesuatu dan hanya perlu menjalankan program yang dihasilkan./file
sering. Saya benar-benar tidak dapat memikirkan skenario lain di mana seseorang akan sering perlu menjalankan file lokal dan jika dia tidak menjalankannya sering dia tidak akan repot mengajukan pertanyaan (katanya sulit bukan tidak mungkin ) (2) tidak terlalu tetapi Anda bisa meneruskan argumen dalam resep.Untuk memperluas jawaban Zanna tentang penerjemah (maaf, tidak ada perwakilan untuk komentar): "penerjemah" untuk executable asli (alias file ELF biner) adalah pemuat dinamis (
ld.so
), tetapi biasanya tidak memahami sintaks yang Anda inginkan:(juga, kecuali Anda terhubung
ld.so
ke jalur Anda, Anda masih perlu menulis/
s)sumber
binfmt_misc
./libexec/ld-elf.so.1
. Di Linux, ini tidak sesederhana "memutuskan cara menjalankan biner":binfmt_misc
mendeteksi format file dengan angka ajaib (ELF, skrip shebang, CIL). Setelah itu,binfmt_elf
pawang dipanggil. Ini mem-parsing header dan bagian ELF;.interp
bagian berisi jalur pemuat dinamis; loader ini dimulai oleh kernel, melakukan relokasi, dan melompat ke_start
. Pada FreeBSD (tidak yakin tentang yang lain) tidak ada binfmt, tetapi prinsipnya adalah +/- serupa.ld.so
tidak memiliki.interp
dan terhubung secara statis, yang berarti tidak perlu untuk linker / loader dinamis lain untuk menyelesaikan simbol eksternal dan melakukan relokasi matematika.Jika kita diizinkan untuk mengkonfigurasi hal-hal
Kebanyakan distro modern menyertakan ~ / .local / bin dalam $ PATH (tambahkan
export PATH="$HOME/.local/bin:$PATH"
ke Anda~/.profile
jika milik Anda tidak). Maka Anda bisa menggunakanx file
untuk menjalankan./file
.Jangan mencoba mendefinisikan
.
perintah. Perintah. script
sudah berjalanscript
di shell saat ini. Ini memungkinkanscript
untuk mendefinisikan variabel lingkungan untuk shell saat ini.sumber
exec "$@"
.$ (ln -s /bin/ls my-ls && exec my-ls) # bash: exec: my-ls: not found
shift $1
; adilexec ./"$@"
. (2) Karena Anda berbicara tentang skrip shell, itu sedikit gunanya / menyesatkan untuk menyarankan orang untuk tidak mendefinisikan.
perintah, karena tidak mungkin untuk membuat file bernama.
. (Dimungkinkan, dan sangat tidak disarankan, untuk mendefinisikan alias atau fungsi shell yang disebut.
.)Jika kami diizinkan membuat skrip pembantu, Anda bisa membuat pembantu yang menambahkan pwd ke PATH, lalu jalankan
Ini menghindari menambahkan "." ke jalan dan mencemari profil. Anda dengan setiap jalur Anda mungkin pada suatu titik ingin menjalankan sesuatu.
Kita dapat mengambil pendekatan ini selangkah lebih maju dengan membuat helper yang meluncurkan shell baru dengan PATH yang dimodifikasi. Jika itu mengambil direktori sebagai parameter (menggunakan pwd sebagai default), itu akan berfungsi seperti
pushd
yang mengedit path. Anda mungkin harus sadar bahwa perubahan pada variabel lingkungan lain akan hilang saat keluar dari subkulit, tetapi dalam shell yang sudah berjalan lama, variabel PATH Anda tidak akan berantakan semua. Tergantung pada alur kerja Anda, ini mungkin menguntungkan.Tapi saya kira jika Anda ingin menjalankan dengan itu Anda bisa hack
pushd
danpopd
sehingga mereka dapat membuat modifikasi yang sama untuk jalan tanpa tanpa membuat subkulit yang akan kehilangan perubahan lain.(Anda tidak dapat melakukan hal yang sama dengan
cd
karena tidak memiliki analogpopd
.)Anda juga bisa membuat pasangan pembantu yang berdedikasi untuk hanya menekan dan memunculkan entri PATH. Apa yang paling berhasil sangat tergantung pada pola penggunaan Anda.
sumber
cd
, tetapi lebih jauh di luar sana: Buat file seperti.dircmds
, dan retascd
untuk membuat perintah yang didefinisikan./.dircmds
tidak tersedia sebelum beralih dan tersedia segera setelah beralih.Anda dapat menggunakan
. script.sh
sintaks selama skrip yang ingin Anda jalankan ada di direktori saat ini.Anda juga bisa mengawali dengan juru bahasa, seperti sh atau bash. contoh:
bash script.sh
sumber
. script.sh
akan rusak jika skrip berisiexit
, memiliki efek yang tidak diharapkan, misalnya jika skrip didefinisikan ulang "sementara"; itu juga hanya berfungsi untuk skrip untuk shell Anda saat iniexit
Anda bisa meletakkannya di dalam tanda kurung, yaitu subkulit, tetapi benar, itu masih akan hanya untuk skrip dalam shell yang sama.