Tente
parent_path=$(echo "$current_path"/ | sed -e "s|[^/]||g" -e "s|/|../|g")
cd "${current_path}" ; ln -s "${parent_path}${parent_file_to_link}"
Isso funciona simplesmente contando as barras em "${current_path}" .
A profundidade desejada é mais uma que o número de barras
(por exemplo, a profundidade de test/dir/hello , que contém duas barras, é 3),
então simplesmente adicionamos uma barra: echo "$current_path"/ . Pipe em sed .
Como estamos manipulando barras, é mais fácil usar um caractere diferente de /
como o delimitador do comando sed s s ; Eu gosto de usar a barra vertical ( | ).
s|[^/]||g encontra todos os caracteres que não são slash
e substitui-os por nada.
Em outras palavras, ele exclui todos os caracteres, exceto as barras.
Então, para o valor "${current_path}" de test/dir/hello ,
nós echo 'd test/dir/hello/ e, em seguida, reduzimos para /// .
Então s|/|../|g" muda cada / para ../ , então acabamos com ../../../ .
Nota: isso pressupõe que "${current_path}"
não tem nenhum excesso (desnecessário) barras nele.
Por exemplo, test/dir//hello e test/dir/hello/
são logicamente equivalentes a test/dir/hello ,
mas eles contêm um número enganoso de caracteres slash,
o que irá corromper este processo.
P.S. Sempre cite todas as variáveis da shell, a menos que você tenha uma razão para não
e você tem certeza de que sabe o que está fazendo. Usando chaves
(como em ${variable_name} ) não é o equivalente a citar.