$ PATH ortam değişkenindeki yüzde


16

$ PATH'ım şöyle:

/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

Bash, ben sorun olmadan bulunan değnek çağırabilir

/home/torbjorr/deployed/x86_64-GNU%2fLinux/wand

sevmek

$ 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

Ancak, bourne kabuk uyumluluk modunda, değnek bulunamaz:

$ wand
sh: 2: wand: not found

Sorun, bu yollardaki% işaretidir. Bu işaret URL kodlaması ile eklenmiştir, böylece "GNU / Linux" adı geçerli bir dosya adı olmasa bile dizin adında kullanılabilir. Adın sh olarak çalışmasını sağlamak veya sh komutunun bash olarak çalışmasını sağlamak mümkün mü? Yani, yine de bash için bağlanan / bin / sh komutuyla çağrılmış olsa bile bash'ın aynı şekilde davranmasını sağlayın.


Güzel soru. Görünüşe göre '%' karakteri $ PATH içinde doğru çalışmıyor sh(ok bashve zsholsa da). Doğrudan çalıştırılabilir çağırmak çalışır sh; gerçekten garip.
Rmano

%% 2 kullanırsanız ne olur?
mikeserv

Veya%?
mdpc

Yanıtlar:


15

Bu Bourne kabuğu ya bashda Bourne kabuğunu taklit etmek, bu Almquist kabuğu, sizin durumunuzda muhtemelen Debian Almquist kabuğu (orijinal Almquist kabuğuna dayanan Debian BSD'lerin kendisinin bir Linux çatalı).

Almquist kabuk (orijinal ve modern versiyonları) olarak, %kullanılan PATHekstra özellikler spesifik için ash. Belgelerden alıntı:

Yol Arama

Bir komutu bulurken, kabuk önce o ada göre bir kabuk işlevine sahip olup olmadığına bakar. Ardından, PATH için bir giriş içermiyorsa %builtin, bu adda yerleşik bir komut arar. Son olarak, PATH içindeki her girişi sırayla komutu arar.

PATH değişkeninin değeri, iki nokta üst üste işareti ile ayrılmış bir dizi girdi olmalıdır. Her girdi, bir dizin adı veya dizin adından sonra yüzde işaretiyle başlayan bir bayraktan oluşur. Geçerli dizin boş bir dizin adıyla belirtilmelidir. Yüzde işareti yoksa, giriş kabuğun belirtilen dizindeki komutu aramasına neden olur. Bayrak ise %builtin , kabuk yerleşik komutlarının listesi aranır. Bayrak ise %func , dizin kabuğa girdi olarak okunan bir dosyayı arar. Bu dosya, adı aranan komutun adı olan bir işlev tanımlamalıdır.

Eğik çizgi içeren komut adları, yukarıdaki aramalardan hiçbirini gerçekleştirmeden kolayca yürütülür.

İşlevler mekanizmasının otomatik olarak yüklenmesi kshveya zshbuna benzer diğer kabuklar , ancak farklı bir değişken ( $FPATH) kullanırlar, ancak hangi işlevlerin veya yürütülebilir dosyaların öncelikli olduğunu tanımlayamazsınız.

Sizin durumunuzda, bayrağın /home/torbjorr/deployed/vector/x86_64-GNU%2fLinuxbulunduğu /home/torbjorr/deployed/vector/x86_64-GNUdizin olarak yorumlanır 2fLinux. Bu bayrak bilinmediği için yok sayılır.

Bunun baska yolu yok. Külün %özel olarak işlem görmemesi için bir kaçış mekanizması olsa bile , o zaman diğer kabuklarda veya $PATHbenzeyen diğer şeylerde işe yaramaz execvp().

%Karakterleri kaldırmanız gerekeceğinden $PATHdizininizi yeniden adlandırın veya bir sembolik bağlantı ekleyin.

Veya kullanmayan ashşunlara ait /bin/sh. Bunu yapmayan diğer hafif POSIX kabuk uygulamaları yashve mksh.


Bu cevap bir açıklama verse de, bir çözüm getirmez. % 'İ tutmanın uyumlu bir yolu var mı?
user877329

@ user877329, burada gerçek bir çözüm yok. Düzenlememe bakın.
Stéphane Chazelas

3
Başka bir deyişle, Debian shPOSIX standardını ihlal eder. Ayrı bir noktaya sahip olmanın shtam olarak bazı uyumsuz kabuk uzantısının üzerinden gitmediğinizden emin olmanız gerektiği göz önüne alındığında (sanırım kimse /bin/shbugünlerde giriş kabuğu olarak kullanmıyor ), bir hata olduğunu düşünürdüm.
celtschk

1
@celtschk, ash/ bin / sh için kullanım noktasının, performansın performansından kaçınmak için daha fazla olmasına rağmen bash, bu nedenle yashveya mksh(veya poshtüm uzantıları hariç tutmak istiyorsanız) kullanmaktan daha iyi bir seçenek olduğunu kabul etti bash. Ayrıca, bir köşe davası olarak düşünülebilir. Normalde hiç kimse %bir yol bileşeninde bulunmazdı. Çoğu merminin POSIX uyumlu olmadığı köşe kasaları vardır.
Stéphane Chazelas

1
mtmiller, taşınabilir dosya adı karakter kümesinin (PFCS) anlamını bu şekilde okumadım. POSIX, programlama API'lerini belirtir ancak dosya sistemi uygulamalarını belirtmez. PFCS, geçerli yerel ayar ne olursa olsun dosya sistemi ne olursa olsun çalışacak minimum POSIX garantisidir, ancak dosya sistemi tarafından destekleniyorsa ve geçerli yerel ayarda geçerliyse bir aracın dosya adındaki bir karakteri kabul etmemesi için bir mazeret değildir. Örneğin POSIX, [bu karakter PFCS'de olmasa bile bir komut olmasını gerektirir .
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.