如何使用内置的bash替换子shell或函数的输出


9

我正在尝试使用内置的bash子字符串替换子shell或另一个bash函数的输出。

以下命令在zsh中效果很好。但会导致bad substitutionbash错误:

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

要么

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

输出应该是最后一个文件夹$PWD,取而代之的是latest,当我的当前目录是trunk

所以/home/user/trunk应该成为latest

是否有bash等效项允许在不依赖变量或管道的情况下链接字符串版本?还是bash内置函数仅允许输入为字符串或纯变量?

Answers:


9

不,替代运算符的嵌套是唯一的zsh

请注意,与with一起zsh使用时(t)csh,您也可以这样做${PWD:t:s/trunk/latest/}

尽管bash还支持用于历史记录扩展的csh history修饰符,但不支持它们用于参数扩展。

在此处bash,使用一个临时变量:

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

3

用bash尝试一下:

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

或使用一个命令:

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

结果在 ${BASH_REMATCH[1]}


0

你想要...?

PWD=latest

我看不到您提出要求的方法。如果要替换所有$PWD带有最新功能的-尽管最好的方法是cd到最新。

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

...这将带您到最新,并将路径名打印到stdout。通过cd -再次执行操作,您可以回到原来的位置。您可以执行以下w / $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

问题不在于替代本身,它可以通过sed几个步骤来实现。但是我不明白为什么bash拒绝执行subshel​​l,然后像其他任何字符串一样替换其内容
yabuki_joe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.