bash - sonucun hangi komuttan cd'ye yönlendirileceği


87

Sonucu bir whichkomuttan nasıl aktarabilirim?cd ?

Yapmaya çalıştığım şey bu:

which oracle | cd
cd < which oracle

Ama hiçbiri çalışmıyor.

Bunu başarmanın bir yolu var mı (elbette kopyala / yapıştır yerine)?

Düzenleme: İkinci olarak düşünüldüğünde, bu komut başarısız olur çünkü hedef dosya bir klasör / dizin DEĞİLDİR .

Bu yüzden şimdi sondaki "/ oracle" kısmından kurtulmanın daha iyi bir yolunu düşünüyorum ve üzerinde çalışıyorum (sed veya awk, hatta Perl) :)

Düzenleme: Tamam, sonunda sahip olduğum şey bu:

cd `which oracle | sed 's/\/oracle//g'`

2
bu size komut verir, dizin değil
Anycorn

programın kurulu olduğu dizini almaya mı çalışıyorsunuz? dirname, basename ?
Anycorn

@aaa: Eğer doğru, o benim sed apporach başarısız neden :) "gerçek dir" değil oracle yürütülebilir sembolik bağlantı ... işaret ettiğinden birdizin daha iyi olduğunu düşünüyorum edilir
Michael Mao

Yanıtlar:


129

Komutun standart girdiden parametreler beklediği durumlarda boruyu kullanırsınız. ( Bu konuda daha fazlası ).

İle cdkomuta Eğer durum değildir. Dizin, komut bağımsız değişkendir. Böyle bir durumda, komut ikamesini kullanabilirsiniz. Ters tikleri kullanın veya $(...)komutu değerlendirmek için bir değişkene kaydedin ..

path=`which oracle`
echo $path # just for debug
cd $path

çok daha basit bir şekilde yapılabilmesine rağmen:

cd `which oracle` 

veya yolunuzun özel karakterler varsa

cd "`which oracle`"

veya

cd $(which oracle)

Bu, geri tepme notasyonuna eşdeğerdir, ancak önerilir (ters işaretler kesme işaretleriyle karıştırılabilir)

.. ama istediğiniz gibi görünüyor:

cd $(dirname $(which oracle))

(bu size yerleştirmeyi kolayca kullanabileceğinizi gösterir)

$(...) (ve ters işaretler) çift tırnaklı dizelerde de çalışır, bu da sonuçta boşluklar içerdiğinde yardımcı olur.

cd "$(dirname "$(which oracle)")"

(Her iki çıktının bir dizi çift tırnak gerektirdiğini unutmayın.)


Güzel. Burada neler olup bittiğini biraz açıklar mısınız? Bu değişken bir referansa benziyor; Bir komutun sonuçlarının gittiği bazı varsayılan geçici değişkenler var mı?
Nate W.

Ahhh, ters vuruşlar için yarışmayı unuttum :(
Michael Mao

4
Sen tırnak bir çift daha gerekir: cd "$(dirname "$(which oracle)")".
Philipp

|Böylece bile yeni bir süreç açar cdSTDIN'den okumak cmd | cddeğil çalışma (yani orjinal sürecinde cari dizin aynı kalacağını) olacaktır.
Kyle Strand

24

Dizini almak için dirname ile:

cd $(which oracle | xargs dirname)

DÜZENLE: boşluk içeren yollara dikkat edin, aşağıdaki @anishpatel yorumuna bakın


3
cd "$(which oracle | xargs -0 dirname)"Yol boşluk içeriyorsa kullanın . -0 bayrağı, girdiyi boşluk yerine null değerine böler.
anishpatel

9
cd `which oracle`

Bunların ters işaret olduğuna dikkat edin (genellikle ABD klavyesinde 1'in solundaki tuş)


1
Yol boşluklar veya diğer "özel" karakterler içeriyorsa bu işe yaramaz ve dosya adını çıkarmanız gerekir.
Philipp

@Philipp, yolunuzda özel karakterler varsa bunu kullanabilirsinizcd "`which oracle`"
Ram Patra

4

Tamam, işte doğru alıntıyı kullanan bir çözüm:

cd "$(dirname "$(which oracle)")"

Ters işaretlerden kaçının, daha az okunabilirdir ve her zaman işlem ikamelerinden alıntı yapın.


2

Bir boruya ihtiyacınız yok, Bash parametre genişlemesini kullanarak istediğinizi yapabilirsiniz!

Daha fazla ipucu: Bash kullanıyorsanız harici "which" komutu yerine "tip -P" kullanın.

# test
touch /ls
chmod +x /ls
cmd='ls'
PATH=/:$PATH
if cmdpath="$(type -P "$cmd")" && cmdpath="${cmdpath%/*}" ; then
   cd "${cmdpath:-/}" || { echo "Could not cd to: ${cmdpath:-/}"; exit 1; }
else
   echo "No such program in PATH search directories: ${cmd}"
   exit 1
fi

1

Düzenlenen sorunuza yanıt olarak, aşağıdaki komutu kullanarak komutun adını kaldırabilirsiniz dirname:

cd $(dirname `which oracle`)

Yol boşluklar veya diğer "özel" karakterler içeriyorsa bu çalışmaz.
Philipp

1
Çift tırnakla kolayca sabitlenir.
David Z

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.