$ PATH saya terlihat seperti ini:
/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux:/home/torbjorr/deployed/typewriter/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mustudio/x86_64-GNU%2fLinux:/home/torbjorr/deployed/mathext/x86_64-GNU%2fLinux:/home/torbjorr/deployed/doxymax/x86_64-GNU%2fLinux:/home/torbjorr/deployed/c2tex/x86_64-GNU%2fLinux:/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand:/home/torbjorr/deployed/x86_64-GNU%2fLinux/spellesc:/home/torbjorr/deployed/x86_64-GNU%2fLinux/projinit:/home/torbjorr/deployed/x86_64-GNU%2fLinux/herbs:/home/torbjorr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
Dalam bash, saya bisa tanpa masalah memanggil tongkat yang terletak di
/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand
Suka
$ wand
(i) Mål från "main.cpp" har registrerats
(i) Skapar katalog "__wand_targets_dbg"
(i) Kör g++ "main.cpp" -fpic -L"/home/torbjorr/deployed" -g -Wall -std=c++11 -I"/home/torbjorr/deployed" -o "__wand_targets_dbg/cb-template
Namun, dalam mode kompatibilitas shell bourne, tongkat tidak dapat ditemukan:
$ wand
sh: 2: wand: not found
Sepertinya masalahnya adalah tanda% di jalur ini. Tanda ini telah ditambahkan oleh penyandian URL sehingga nama "GNU / Linux" dapat digunakan dalam nama direktori meskipun itu bukan nama file yang valid. Apakah mungkin untuk membuat nama berfungsi di sh, atau menjadikan perintah sh bekerja sebagai bash. Yaitu, buat bash berperilaku sama meskipun dipanggil dengan perintah / bin / sh, yang tetap terhubung dengan bash.
sh
(ok dibash
danzsh
meskipun). Langsung memanggil karya yang dapat dieksekusi dish
; sangat aneh.Jawaban:
Itu bukan shell Bourne, atau
bash
meniru shell Bourne, itu shell Almquist, dalam kasus Anda mungkin shell Debian Almquist (garpu Linux oleh Debian dari BSD sendiri berdasarkan shell Almquist asli).Dalam shell Almquist (yang asli dan versi modern),
%
digunakanPATH
untuk fitur tambahan khususash
. Mengutip dari dokumentasi:Kerang lain suka
ksh
atauzsh
memiliki autoloading yang sama dari mekanisme fungsi, tetapi mereka menggunakan variabel yang berbeda ($FPATH
), tetapi Anda tidak bisa menentukan fungsi atau executable mana yang diutamakan.Dalam kasus Anda,
/home/torbjorr/deployed/vector/x86_64-GNU%2fLinux
ditafsirkan sebagai/home/torbjorr/deployed/vector/x86_64-GNU
direktori dengan2fLinux
bendera. Bendera itu diabaikan karena tidak diketahui.Tidak ada cara selain itu. Sekalipun abu memiliki mekanisme melarikan diri sehingga ini
%
tidak diperlakukan secara khusus, maka ia tidak akan bekerja di kulit lain atau benda lain yang terlihat$PATH
sepertiexecvp()
.Anda harus menghapus
%
karakter dari$PATH
, jadi ganti nama direktori Anda atau tambahkan symlink.Atau jangan gunakan
ash
untuk Anda/bin/sh
. Implementasi shell POSIX ringan lainnya yang tidak termasukyash
danmksh
.sumber
sh
melanggar standar POSIX. Mengingat bahwa titik memiliki terpisahsh
adalah persis bahwa Anda harus yakin untuk tidak tersandung beberapa ekstensi shell yang tidak kompatibel (saya kira tidak ada yang menggunakan/bin/sh
sebagai shell login hari ini), saya akan mempertimbangkan bug.ash
untuk / bin / sh lebih untuk menghindari hukuman kinerja menggunakanbash
, jadi menggunakanyash
ataumksh
(atauposh
jika Anda ingin mengecualikan semua ekstensi) masih merupakan opsi yang lebih baik daripada menggunakanbash
. Juga, orang dapat menganggapnya sebagai kasus sudut. Tidak ada yang biasanya memiliki%
komponen jalur. Sebagian besar cangkang memiliki kasing sudut yang tidak sesuai dengan POSIX.[
perintah meskipun karakter itu tidak ada di PFCS.