Alt kabuk veya işlevin çıktısını değiştirmek için bash yerleşimini kullanma


9

Bir subshell veya başka bir bash işlevinin çıkışını değiştirmek için yerleşik bash subring kullanmaya çalışıyorum.

Aşağıdaki komutlar zsh'de oldukça iyi çalışır; ancak bad substitutionbash hatasıyla sonuçlanır :

${${PWD##*/}//trunk/latest}

veya

${$(basename $PWD)//trunk/latest}

çıktının son klasörü olmalı ve geçerli dizinim olduğunda $PWDdeğiştirilmelidirlatesttrunk

öyle /home/user/trunkolmalılatest

Değişkenlere veya borulara güvenmeden dizelerin sürümlerini zincirlemeye izin veren bir bash eşdeğeri var mı? Veya bash yerleşik girişleri yalnızca bir dize veya düz değişken olabilir mi?

Yanıtlar:


9

Hayır, ikame operatörlerinin yuvalanması benzersizdir zsh.

İle olduğu zshgibi (t)csh, yapabileceğinizi unutmayın ${PWD:t:s/trunk/latest/}.

Gerçi bashda tarih genişlemesi için bu csh tarih değiştiricilerini destekler, onun parametre açılımları onları desteklememektedir.

Burada bashgeçici bir değişken kullanın:

var=${PWD##*/} var=${var//trunk/latest}

3

Bunu bash ile deneyin:

[[ $PWD =~ .*/(.*) ]] && echo "${BASH_REMATCH[1]//trunk/latest}"

veya tek bir komutla:

[[ $PWD =~ .*/(.*) && ${BASH_REMATCH[1]//trunk/latest} =~ (.*) ]]

Sonuç ${BASH_REMATCH[1]}


0

istiyor musun...?

PWD=latest

İsteğiniz için bir yöntem görmüyorum. Eğer $PWDw / latest'ın tümünü değiştirmek istiyorsanız - bunu yapmanın en iyi yolu cden sonuncudur.

[ /home/user/trunk = "$PWD" ] && OLDPWD=../latest cd -

... bu da sizi en son sürümüne götürecek ve yol adını stdout'a yazdıracaktır. cd -Tekrar yaparak geldiğiniz yere geri dönebilirsiniz . Aynı şeyi w / ile yapabilirsiniz $CDPATH:

mkdir -p /tmp/{1..5}  ; \
CDPATH=/tmp cd 3; cd -; \
echo "${CDPATH:-empty or unset::}" "$OLDPWD"

/tmp/3
/home/mikeserv
empty or unset:: /tmp/3

Konu ikamenin kendisinde değildir, sedbirkaç adımda elde edilebilir . Ama neden
bash'ın subshell'i
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.