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?

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}

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]}


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.