Fiquei confuso, tentando copiar alguns arquivos de um PC para outro. Eu já entendi, mas a sintaxe ainda é confusa para mim. Isso funciona:
scp ~/Desktop/Volenteer.png jay@server.ip:~j0h/b
que coloca Volenteer.png
na pasta /home/j0h/b
. No entanto, isso não funciona:
scp ~Desktop/Volenteer.png jay@server.ip:~j0h/b
Isso também falha, fornecendo um arquivo de status de saída 1 não encontrado:
scp ~/Desktop/Volenteer.png jay@server.ip:~/j0h/b
Como faz isso:
scp ~Desktop/Volenteer.png jay@server.ip:~j0h/b
Então, claramente, há alguma diferença entre ~
e ~/
Essa diferença é a presença de/
$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory
Então, por que, no scp, a ~
resolução é ~/
? Isso é um palpite, não posso verificar o que está acontecendo. Mas parece inconsistente e, portanto, confuso. Isso é um bug no scp? ou há algo sobre til que estou faltando?
Respostas:
~
é o seu diretório inicial.~foo
é o diretório inicial do usuáriofoo
, se esse usuário existir, ou apenas um diretório nomeado~foo
, se esse usuário não existir.Portanto, em:
~Desktop
será expandido para o diretório inicial do usuárioDesktop
, se esse usuário existir (e geralmente não existe) ou será apenas~Desktop
(um caminho que geralmente também não existe).Em:
~/j0h
será expandido para um diretório nomeadoj0h
nojay
diretório inicial do qual, novamente, é improvável que exista.Não é
~
e~/
onde a diferença ocorre, mas em~
e~foo
.Além disso,
~
também pode ser usado para navegação no histórico de diretórios:~-
é o diretório de trabalho anterior (como$OLDPWD
)~+
é o diretório de trabalho atual (como$PWD
)Isso não se aplica
scp
, pois você não pode alterar os diretórios no meio de umascp
operação.E se você usar
pushd
epopd
manter uma pilha de diretórios, e seria o th diretório na pilha de diretórios, como visto na saída de . seria o diretório th do final (contando de zero, nos dois casos). Por exemplo:~N
~+N
N
dirs
~-N
N
Em seguida, os diretórios na pilha podem ser acessados usando:
fonte
~+
é sempre equivalente a.
isso, certo? Parece redundante.~+
e~-
use os valores de$PWD
e$OLDPWD
, que são caminhos absolutos..
é sempre um caminho relativo. Portanto, se houver um comando que altere o diretório de trabalho atual durante a execução, ele verá o novo caminho para.
onde o caminho expandido~-
permanecerá o mesmo.tar -C
é um exemplo, embora eu admita que não consigo pensar em um bom uso~+
.$PWD
seria tão bom, exceto que você não precisa citar~+/foo/bar
se$PWD
contiver espaços../filename
mas pode usar"$PWD/filename"
ou mais simplesmente~+/filename
. (E alguns comandos funcionarão em nomes de caminho relativos, mas há uma diferença funcional, comoln
outar
.) #Leia a documentação do GNU para expansão do Bash Tilde (como eu deveria ter antes da minha primeira iteração desta resposta).
~/Desktop
e~j0h
estão fazendo coisas fundamentalmente diferentes, o que explica por~Desktop
que não funciona:Uma planície
~
é substituída pela sua$HOME
variável de ambiente atual , definida no login. Então~
resolve/home/oli
para mim e~/Desktop
lê como/home/oli/Desktop
. É aqui que você vê o tilda sendo mais usado.~username
resolve a casa de que o usuário , conforme definido nas/etc/passwd
. Assim,~oli
resolve/home/oli
,~j0h
pode resolver,/home/j0h
mas não é necessário, seu homedir pode estar em qualquer lugar.~not-a-username
não resolve. PorqueDesktop
não é um usuário,~Desktop
não é substituído. É tomado literalmente como um arquivo ou caminho chamado~Desktop
(que não existe aqui).E nem é preciso dizer que tudo isso está acontecendo remotamente (seria inútil
scp
se fosse substituído por valores locais). Isso funciona porque o Bash não substitui~...
se for precedido por algo que não seja espaço em branco.fonte
getent passwd bin
diz?~dir
é consistente com os documentos GNU: "... os caracteres no prefixo de til após o til são tratados como um possível nome de logon ... Se o nome de logon for inválido ou a expansão do til falhar, a palavra permanece inalterado ". Aqui,dir
não é o nome de um usuário neste sistema, portanto, ele permanece inalterado.O símbolo
~
é usado como um atalho para/home/user
inbash
, portanto, no caso~/Desktop/Volenteer.png
dele, é um atalho para/home/user/Desktop/Volenteer.png
.Como você pode ver
/
, como sempre, mostra um novo nível na hierarquia do sistema de arquivos.fonte
~{user}/
poderia ser qualquer caminho aleatório, conforme definido pelo arquivo de banco de dados passwd (5). Embora sim, os padrões filesytem.org colocam usuários regulares em / home, esse não é o caso de todos os usuários (ou seja, raiz em / root e serviços em / var / ... ou unixies mais antigos usando / usr em vez de / home)/usr
.~
é uma abreviação para a variável de ambiente$HOME
na maioria dos shells compatíveis com o derivado c shell / compatível com POSIX. o uso mais comum~
é quando você faz referência ao seu próprio diretório pessoal ou ao diretório inicial de outro usuário:Para localizar o diretório inicial de qualquer usuário local em um sistema POSIX (UNIX, Linux, OS X, BSD) que esteja usando o banco de dados passwd (5), execute o awk da seguinte
/etc/passwd
maneira:Isso listará cada usuário local e seu diretório inicial.
fonte