Bir programı çağırırken geçerli çalışma dizinini ayarlamak için bir POSIX (veya en azından popüler) bir yardımcı program var mı?


20

Çalıştırmak istediğimiz komutun ortamını değiştirmek için env (1) var (örneğin env MANPAGER=more man dtrace). Komutun başlatılacağı dizini değiştirmek için benzer bir şey var mı?

İdeal olarak, şöyle görünmesini isterim:

theMagicCommand /new/cwd myProgram

Bu şekilde diğer env (1) benzeri komutlarla "zincirlenebilir", ör.

daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram

Şimdiye kadar env (1) ile aynı arayüze sahip olmayan aşağıdaki çözümü düşünebilirim :

cd /new/cwd && myProgram

Ayrıca, ben sadece böyle basit bir kabuk komut dosyası oluşturabilirsiniz:

#! /bin/sh -
cd "${1:?Missing the new working directory}" || exit 1
shift
exec "${@:?Missing the command to run}"

ama zaten var olan bir şeyi arıyorum (en azından macOS ve FreeBSD'de).

myProgrammutlaka bir masaüstü uygulaması değildir (bu durumda Path anahtarını bir .desktop dosyasında kullanabilirim ).


6
cd /new/cwd && env VAR=value myProgramEleştirmen neden karşılanmıyor?
jpaugh

M. Piotrowski'nin bununla aynı arayüz olmadığını açıkladığı soru zaten env. Şuna bak env. O ile karşılaştırın rtprio, idprio, numactl, jexec, chrt, toolsets içinde ve aslında komutlar cevapları bahsetti. Bir desen var ve zincir yükleniyor.
JdeBP

3
"Arayüz" ile ne demek istiyorsun? Neden kullanmıyorsunuz (cd the/cwd; cmd)?
Konrad Rudolph

2
@KonradRudolph Örneğin (cd the/cwd; cmd)env (1) öğesine sh (1) ile sarmadan kolayca geçemezsiniz .
Mateusz Piotrowski

Yanıtlar:


19

AFAIK, POSIX takım sandığında böyle özel bir yardımcı program yok. Ancak sh, shkomut dosyasında olduğu gibi bir komut çalıştırmadan önce bir ortam (cwd, sınırlar, stdout / in / err, umask ...) oluşturmayı çağırmak yaygındır .

Ancak bu komut dosyasını bir dosyaya yazmak zorunda değilsiniz, sadece satır içi yapabilirsiniz:

sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args

(dizinin olmadığı varsayılarak -). Ekleme CDPATH=(çevrede bir tane olması durumunda) ve -Pbunun daha çok bir düz gibi davranması için chdir().

Alternatif olarak, perlkimin kutusundan çıkar chdir()çıkmaz kullanabilirsiniz chdir().

perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
         ' /some/dir cmd args

Ah evet. Bu, soruma dahil ettiğim komut dosyasının çok kullanışlı bir varyasyonu var. Aradığım yardımcı programın işlevselliği zaten nispeten kısa bir sh (1) oneliner ile mevcut olduğundan korktum.
Mateusz Piotrowski

8
Zaten koşuyorsanız shda yapabilirsiniz (cd /wherever && exec /my/command). ()Örtülü sarılmış komutları çalıştırmak için bir altkabuk açar ve kursu, exechızlı olduğu kadar ekstra kabuk sürecinin kurtulur /my/commandbaşlar koşuyor.
jpaugh

2
Bu, şimdi silinmiş bir cevapta önerildi. Soru soran, bunun xe'nin sorduğu soruya bir cevap olmadığını açıkladı.
JdeBP

15

Daemontools dünyasında ve başka yerlerde kullanılan araç setlerinde bu ve daha fazlası var; yıllardır vardı; ve yaygın olarak kullanılabilir.

  • Wayne Marshall'ın perp'inde runtool:

    runtool -c / yeni / cwd programım
  • Laurent Bercot'un performansı cd:

    cd / yeni / cwd myProgram
  • benim nosh araç seti var chdir:

    chdir / new / cwd myProgram

Bunların hepsi tam olarak bu tür zincirlerde kullanılmak üzere tasarlanmış zincir yükleme araçlarıdır. Bu araç setlerinde başka amaçlar için çok çeşitli zincir yükleme araçları bulunmaktadır.

daha fazla okuma


11

Böyle popüler bir program var. Bu denir ... bekletme Sandalyenin üzerine ... Trampet ... env. GNU sürümü, POSIX değil, 8.28 sürümünden beri -C, dizini istediğiniz gibi ayarlamanıza olanak tanır:

    ADI
           env - bir programı değiştirilmiş bir ortamda çalıştır

    ÖZET
           env [SEÇENEK] ... [-] [İSİM = DEĞER] ... [KOMUT [ARG] ...]

    AÇIKLAMA
           Ortamdaki her bir NAME değerini VALUE olarak ayarlayın ve COMMAND komutunu çalıştırın.

           Uzun seçenekler için zorunlu argümanlar kısa seçenekler için de zorunludur.

           -i , --ignore-çevre
                  boş bir ortamla başla

           -0 , - boş
                  her çıkış satırını satırsonu değil, NUL ile bitirin

           -u , --unset = NAME
                  değişkeni ortamdan kaldır

           -C , --chdir = DIR çalışma dizinini DIR olarak
                   değiştir

           --help bu yardımı göster ve çık

           version
                  sürüm bilgisi çıktısı al ve çık

           Sadece - ima eder - i . KOMUT yoksa, ortaya çıkan ortamı yazdırın.


MacOS ve FreeBSD'de kullanıma hazır olmasa da harika.
Mateusz Piotrowski

1

Git gibi bazı programların bunun için bir seçeneği vardır:

-C <path>

Geçerli çalışma dizini yerine gitbaşlatılmış gibi çalıştır <path>.

ve yap:

-C dir, --directory=dir

dirDosyaları okumadan veya başka bir şey yapmadan önce dizine geçin .

ve Tar:

-C, --directory=DIR

DIRHerhangi bir işlem yapmadan önce olarak değiştirin . Bu seçenek sıraya duyarlıdır, yani aşağıdaki tüm seçenekleri etkiler.


Evet. Her ne kadar sorum myProgramböyle bir seçenek sunmuyorsa ... Katkınız için teşekkür ederim ama korkarım sorumu hiç cevaplamıyor.
Mateusz Piotrowski
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.