Cara menggunakan bash builtin untuk mengganti output subkulit atau fungsi

9

Saya mencoba menggunakan substring bash bawaan untuk mengganti output subshell atau fungsi bash lainnya.

Perintah-perintah berikut berfungsi dengan baik di zsh; tetapi menghasilkan bad substitutionkesalahan dalam bash:

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

atau

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

output harus menjadi folder terakhir $PWD, digantikan oleh latestketika direktori saya saat initrunk

jadi /home/user/trunkharus menjadilatest

Apakah ada setara bash memungkinkan untuk edisi rantai string tanpa bergantung pada variabel atau pipa? Atau apakah bash built-in hanya memungkinkan input menjadi string atau variabel polos?

yabuki_joe
sumber

Jawaban:

9

Tidak, sarang operator substitusi itu unik zsh.

Perhatikan bahwa dengan zshsuka dengan (t)csh, Anda juga bisa melakukannya ${PWD:t:s/trunk/latest/}.

Meskipun bashjuga mendukung pengubah sejarah csh untuk ekspansi riwayat, ia tidak mendukung mereka untuk ekspansi parameternya.

Di sini dengan bash, gunakan variabel sementara:

var=${PWD##*/} var=${var//trunk/latest}
Stéphane Chazelas
sumber
3

Coba ini dengan bash:

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

atau dengan satu perintah:

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

Hasilnya dalam ${BASH_REMATCH[1]}

Cyrus
sumber
0

apa kau mau...?

PWD=latest

Saya tidak melihat metode untuk permintaan Anda. Jika Anda ingin mengganti semua $PWDw / terbaru - meskipun cara terbaik untuk melakukannya adalah cdke terbaru.

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

... yang akan membawa Anda ke yang terbaru dan mencetak pathname ke stdout. Anda dapat kembali ke tempat asal Anda dengan melakukan cd -lagi. Anda dapat melakukan hal yang sama dengan $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
mikeserv
sumber
Masalahnya bukan terletak pada substitusi itu sendiri, itu dapat dicapai dengan sedbeberapa langkah. Tetapi saya tidak mengerti mengapa bash menolak untuk mengeksekusi subshell, lalu mengganti kontennya seperti string lainnya
yabuki_joe