Como descobrir, de dentro de um script de bash, o caminho em que o script está em
- 4278
- 1311
- Leroy Lebsack
Quando você desenvolve scripts de bash complexos e começa a colocar vários scripts em uma pasta, onde um script interage com outro por, por exemplo, iniciando -o rapidamente, é necessário garantir que soubessem que o caminho foi iniciado, para que possamos iniciar o outros scripts com um nome de caminho totalmente qualificado. Isso é importante porque o primeiro script pode ter sido iniciado de fora do diretório do roteiro. Também poderíamos ter feito isso usando um caminho relativo, então mesmo - de alguma forma - lendo o comando que iniciou o script atual não funcionará.
Neste tutorial, você aprenderá:
- O que
PWD
O comando é e o que faz - Como descobrir de dentro de um script de bash que caminho esse mesmo está em
Requisitos de software e convenções usadas
Categoria | Requisitos, convenções ou versão de software usada |
---|---|
Sistema | Independente da distribuição Linux |
Programas | Linha de comando Bash, sistema baseado em Linux |
Outro | Qualquer utilidade que não esteja incluída no shell bash por padrão pode ser instalada usando sudo apt-get install utility-name (ou yum install para sistemas baseados em redhat) |
Convenções | # - requer que o Linux -Commands seja executado com privilégios de raiz diretamente como usuário root ou por uso de sudo comando$-exige que o Linux-Commands seja executado como um usuário não privilegiado regular |
O que é PWD?
O PWD
O comando em Linux retorna o Diretório de trabalho do caminho quando executado. Qualquer que seja o caminho em que nos encontramos e navegamos anteriormente (ou fomos colocados por nosso sistema operacional, como, por exemplo, quando abrirmos um prompt de comando/terminal), será o que é retornado quando executarmos PWD
.
$ CD / $ PWD / $ CD / HOME $ PWD / Home
Aqui, mudamos para o diretório raiz (/
) e executado PWD
. Nosso caminho atual era o diretório raiz, então /
é devolvido. Nós então mudamos para o /lar
diretório e executado PWD
de novo. O caminho retornado é agora /lar
.
Dentro de um script Bash, o PWD
O comando funcionará da mesma maneira. Também é digno de nota saber que de dentro de um script bash (e na linha de comando também fora de um script bash), podemos usar a variável do sistema operacional especial $ Pwd
que será mantido automaticamente atualizado pelo sistema operacional para conter nosso caminho atual. Isso nos evita de ter que fazer algo como chamar uma subshell, eu.e. Mypath = "$ (PWD)"
não é necessário, podemos simplesmente invocar o $ Pwd
variável.
Para que possamos usar o PWD, certo?
Não exatamente. Imagine a seguinte situação:
$ touch 'mypath.sh '$ echo'#!/bin/bash '>> mypath.sh $ echo 'echo $ pwd' >> mypath.sh $ chmod +x mypath.sh
Aqui definimos um script chamado meu caminho.sh
e o fez executável. Em seguida, pulamos um diretório do nosso diretório doméstico e executamos nosso script:
$ PWD /Home /Roel $ CD… $ ./roel/mypath.sh /home
Considerando que a PWD
comando dentro do nosso meu caminho.sh
O script está funcionando corretamente, há um problema aqui: PWD
devolveu o caminho em que nos encontramos atualmente, ou seja, /lar
enquanto o script é realmente armazenado no /Home/Roel
diretório!
Lembre -se do título do artigo; Estamos procurando o caminho em que o script está armazenado em! Então, como podemos encontrar isso?
O método!
Considerando que não há variável especial no Bash para cobrir o caminho em que o script está armazenado, há um método simples para obtê -lo.
$ cd - /home /roel $ touch 'mypath2.sh '$ echo'#!/bin/bash '>> mypath2.sh $ echo 'mypath = "$ (cd" $ (dirname \ $ 0) "&& pwd)"' >> mypath2.sh $ echo 'echo "$ mypath"' >> mypath2.sh $ chmod +x mypath2.sh
Aqui definimos um script secundário nomeado mypath2.sh
. Dentro dele, colocamos um pequeno código especial ($ (CD "$ (Dirname \ $ 0)"; && PWD)
) que encontrará o caminho em que o script está (mudando para o diretório, com base no \ $ 0
variável (que é o nome do script da maneira como chamamos, eu.e. Usando um caminho relativo ou totalmente qualificado) e solicitando o Dirname para ele (por referência, e observe que ainda pode ser um caminho relativo se o script foi iniciado usando um caminho relativo) e depois mudar para ele (através do cd
) e subsequentemente solicitando o PWD
(Diretório de trabalho do caminho) para o mesmo, dando -nos o caminho totalmente qualificado.
Vamos ver se isso funciona mais corretamente do que apenas usar PWD
:
$ CD… $ PWD /Home $ ./home/mypath2.Sh /Home /Roel
O script funciona corretamente, e embora mypath2.sh
foi relativamente chamado, de fora do diretório de onde reside o script, a saída retornada refletiu corretamente as informações solicitadas; O caminho onde o script existe. Nós armazenamos o mesmo no $ Mypath
variável, e essa variável agora pode ser usada para, por exemplo $ Mypath/Algumscript.sh
onde Algumscript.sh
é outro script no mesmo diretório que mypath2.sh
Conclusão
Neste artigo, primeiro olhamos PWD
E se isso cumpriria o problema em questão, descobrindo o caminho que nosso script reside, o tempo todo. Enquanto PWD
pode funcionar se não mudarmos de diretórios, não funcionará corretamente se estivermos fora do caminho em que o script está dentro. Em seguida, introduzimos um pequeno pedaço de código (Mypath = "$ (CD" $ (Dirname \ $ 0) "&& PWD)"
que sempre retornará o diretório que nosso script está corretamente.
Um pequeno pedaço de código, mas uma grande solução para o nosso problema de codificação de scripts bash! Aproveitar
!
Tutoriais do Linux relacionados:
- Pasta zip no linux
- Como mover a pasta no Linux
- Como verificar o uso do disco por pasta no Linux
- Uma introdução à automação, ferramentas e técnicas do Linux
- Coisas para instalar no Ubuntu 20.04
- Como criar arquivos criptografados compactados com alcatrão e gpg
- Mint 20: Melhor que o Ubuntu e o Microsoft Windows?
- Sistema Linux Hung? Como escapar para a linha de comando e…
- Mastering Bash Script Loops
- Exemplos úteis de linha de comando Bash e truques - Parte 4
- « O que é DMESG no Linux, e como faço para usá -lo?
- Mint 20 melhor que o Ubuntu e o Microsoft Windows? »