explica as opções do comando readlink

2

Alguém por favor pode me explicar seguindo as opções do comando readlink em linguagem simples:

   -f, --canonicalize
      canonicalize  by  following  every symlink in every component of
      the given name recursively; all  but  the  last  component  must
      exist

   -e, --canonicalize-existing
      canonicalize  by  following  every symlink in every component of
      the given name recursively, all components must exist

   -m, --canonicalize-missing
      canonicalize by following every symlink in  every  component  of
      the  given  name recursively, without requirements on components
      existence
    
por Edward Torvalds 12.05.2015 / 01:17

2 respostas

9

Eu acho que é bastante autoexplicativo, então eu realmente não sei a parte que soa ambígua para você ... Vamos ver com um exemplo:

- canoniza

$ mkdir /tmp/realdir
$ mkdir /tmp/subdir
$ ln -s /tmp/realdir /tmp/subdir/link
$ cd /tmp

$ readlink -f ./subdir/link/nonexistentdir/
/tmp/realdir/nonexistentdir

$ readlink -f ./subdir/link/nonexistentfile.txt
/tmp/realdir/nonexistentfile.txt

Quaisquer que sejam as opções, readlink irá:   - traduzir o caminho relativo para o caminho absoluto   - traduza o nome do link simbólico para o caminho real

E como você pode ver acima, com -f , readlink não se importa se a última parte deste caminho (aqui nonexistentfile.txt ) existe ou não.

Se outra parte deste caminho não existir, readlink não produzirá nada e terá um código de retorno diferente de 0 (o que significa que ocorreu um erro). Veja:

$ readlink -f /tmp/fakedir/foo.txt
$ echo $?
1

- canonicalize-existente

Se você tentar o mesmo com -e :

$ readlink -e ./subdir/link
/tmp/realdir

$ readlink -e ./subdir/link/nonexistentfile.txt
$ echo $?
1

Com -e , caso algum componente do caminho não exista, readlink não produzirá nada e terá um código de retorno diferente de 0.

- canonicalize-missing

A opção

-m é o oposto de -e . Nenhum teste será feito para verificar se os componentes do caminho existem:

$ readlink -m ./subdir/link/fakedir/fakefile
/tmp/realdir/fakedir/fakefile

$ ln -s /nonexistent /tmp/subdir/brokenlink

$ readlink -m ./subdir/brokenlink/foobar
/nonexistent/foobar
    
por 12.05.2015 / 15:08
0

that confused me was why would someone need -e and -m options?

Do código-fonte do kernel ./scripts/kconfig/merge_config.sh (o script pega uma lista de valores de fragmentos de configuração e os mescla um por um):

if [ -z "$KCONFIG_CONFIG" ]; then
    if [ "$OUTPUT" != . ]; then
        KCONFIG_CONFIG=$(readlink -m -- "$OUTPUT/.config")
    else
        KCONFIG_CONFIG=.config
    fi
fi

KCONFIG_CONFIG recebe o caminho para o arquivo .config que ainda não existe.

    
por 04.03.2017 / 18:05

Tags