Link simbólico e sudo

10

Eu crio um link simbólico:

ln -s /tmp/folder1 /tmp/folder2

Então eu vou para / tmp / folder2 e corro pwd:

$ cd /tmp/folder2/
$ pwd
/tmp/folder2
$ sudo pwd
/tmp/folder1 # <-- This is the odd part

Por que pwdcom sudodar o diretório original? Estou escrevendo um script bash e preciso do caminho absoluto do diretório atual. Com o sudo, não consigo obter o diretório original.

iDev247
fonte
Seu objetivo é que o pwd retorne o caminho físico (/ tmp / folder1) ou o caminho lógico (/ tmp / folder2) para ambos?
User9517
Objetivo é retornar o caminho lógico ao usar sudo
iDev247

Respostas:

14

O comando pwd é um shell incorporado e / bin / pwd. Sob circunstâncias normais, o built-in será executado em preferência a / bin / pwd. O comando pwd pode ser chamado como pwd -Lou pwd -PO padrão builtin e / bin / pwd são a pwd -Lpartir da página de manual

-L, --logical usa PWD do ambiente, mesmo que contenha links simbólicos

portanto, quando você executa o pwd, na verdade, executa o pwd -L que, na verdade, imprime $ PWD (se existir). Quando você executa sudo pwd, o sudo fornece apenas as variáveis ​​de ambiente que foram solicitadas a serem transmitidas por meio de env_keepdiretivas. O PWD normalmente não está nesta lista, portanto, o sudo pwd precisa descobrir onde está e, na verdade, é executado comopwd -P

-P, --physical evita todos os links simbólicos

A maneira de resolver o problema é usar pwd -Pse você deseja consistentemente o caminho do diretório físico ou (como o @Felix diz) para adicionar PWD à lista de variáveis ​​de ambiente para manter através de uma diretiva env_keep em sudoers

env_keep += "PWD"  
user9517
fonte
Trabalho! Depois que o PWD é adicionado ao env_keep, preciso fazer sudo pwd -Lpara obter o caminho lógico. sudo pwdretorna o caminho físico.
iDev247
6

No bash, pwdé um builtin. /bin/pwdproduz o mesmo comportamento que sudo pwd.

Você vai querer

  1. use sudo pwd -L, que só funciona se você
  2. inclua Defaults env_keep=PWDno seu sudoersarquivo
Felix Frank
fonte