Você está removendo um nome de diretório (fixo) da string aqui.
No shell padrão, você pode fazer isso com a expansão ${parameter#pattern} , e remove pattern desde o início da string em parameter , então ${file#source/} removeria o prefixo source/ .
Além disso, em ksh / Bash / zsh ${parameter/pattern} , a correspondência é removida em qualquer lugar da string, o que corresponde a s/pattern// do sed mais de perto. ( ${..//..} para remover todas as correspondências). Esses padrões são os mesmos usados para curingas de nome de arquivo ; eles não são regexes.
Em fish , há o comando builtin string replace , que parece que pode ser usado aqui:
> set f source/foobar
> string replace source/ "" -- $f
foobar
ou com -r para regex, por isso não precisamos saber o caminho:
> string replace -r "^.*/" "" -- $f
foobar
(Note que eu não sou tão familiarizado com peixes. O acima pareceu funcionar, mas eu não tenho certeza se ele quebra em alguns casos de canto.)