quais são alguns usos de. (período único) & .. (período duplo) na linha de comando do shell

5

O período único . significa o diretório de trabalho atual

O período duplo .. significa pai do diretório de trabalho atual

Eu só consigo pensar em . sendo usado no caminho relativo etc cd ./bin/usr

Como estão os . & .. usado na linha de comando do shell

    
por Computernerd 05.03.2014 / 06:59

7 respostas

5

How are the above . & .. used in the shell command line?

De muitas maneiras, dependendo do contexto. Ilustrações simples:

  • Para resolução de caminho com o comando cd incorporado, por exemplo, como você disse
  • Literally , dentro de um padrão, por exemplo, no contexto da expansão do nome do caminho
  • Em pattern para substituir qualquer caractere único com um comando como grep

Considere man cd , man path_resolution e esta explicação sobre como o comando cd interno funciona internamente ( man cd aqui):

(4). If the first component of the directory operand is dot or dot-dot, proceed to step 6.

(6). Set curpath to the string formed by the concatenation of the value of PWD, a slash character, and the operand.

(8). The curpath value shall then be converted to canonical form as follows, considering each component from beginning to end, in sequence:

a. Dot components and any slashes that separate them from the next component shall be deleted.

b. For each dot-dot component, if there is a preceding component and it is neither root nor dot-dot, the preceding component, all slashes separating the preceding component from dot-dot, dot-dot and all slashes separating dot-dot from the following component shall be deleted. ...

e este, que é um exemplo passo-a-passo de como as etapas acima aparentemente se aplicam à alteração do diretório de /home/user para ../../boot/memtest86 :

# echo $PWD
/home/user
(4). cd ../../boot/memtest86
(6). curpath = /home/user/../../boot/memtest86
(8)b 
/home/user/../../boot/memtest86
/home/../boot/memtest86   //step 1
/        boot/memtest86   //step 2
curpath = /boot/memtest86 //result

Ao aparar componentes de pontos na mesma extensão que a profundidade do diretório de trabalho, inevitavelmente isso produz um caminho expresso a partir da raiz. Os passos para um único caso de ponto, etc., foram ignorados, pois ele concatena como acima, depois remove ./ , o que é muito fácil de imaginar, já que estamos no diretório atual. Isso ilustra como . e .. referenciando o diretório atual e pai são implementados no contexto desse comando internamente, o que não é por meio de "substituição", mas sim algo semelhante à edição de fluxo ...

Você pode investigar a expansão do nome do caminho e a correspondência de padrões em bash

After word splitting, unless the -f option has been set (see The Set Builtin), Bash scans each word for the characters *, ?, and [...] If one of these characters appears, then the word is regarded as a pattern, and replaced with an alphabetically sorted list of file names matching the pattern. ...

Em um padrão para um nome de caminho como este, qualquer caractere diferente de * , ? e [...] corresponde a si mesmo. Isso significa que um ponto pode se corresponder literalmente:

ls .*

... expandirá para .. , . (porque * inclui também nulo) e, consequentemente, listará o diretório atual e pai e também qualquer arquivo ou diretório no diretório atual que literalmente comece com um ponto (. * ) e é seguido por algo mais de qualquer tamanho. Conforme explicado no manual, você tem algum nível de controle sobre o comportamento da expansão, etc. (usando as opções * glob para set e shopt ).

Aqui está um exemplo do caractere sendo usado em um padrão (como é grep pattern file 1 ) para selecionar qualquer caractere, e é claro não relacionado a nomes de arquivos ou diretórios:

ls -la | grep .

Isso imprime o conteúdo do diretório para que ele capture tudo ( grep -v . é usado para capturar linhas vazias ). Geralmente com padrões em tais expressões e certamente esse é o caso de grep , um único ponto corresponde a qualquer caractere único. Finalmente, considere estes caracteres especiais exemplos na seção . do ponto para um lembrete rápido de alguns os diferentes casos de uso.

Assim, um ponto pode ser usado na resolução do caminho, como um caractere literal que faz parte de um padrão, ele pode substituir um único caractere em uma expressão com grep e pode ser até mesmo uma bash builtin usado para executar comandos de um arquivo etc. Como é usado na linha de comando varia com contexto ...

1. Isto é claro sobre a sintaxe de um comando específico. Se um comando aceita um arquivo / caminho como um argumento, então, usando o ponto em seu lugar, como outros mostraram, expande para o diretório de trabalho atual, o que é bastante conveniente.

    
por 05.03.2014 / 13:04
4

além do uso para o diretório de trabalho . também pode ser usado como fonte, como se o seu .bashrc fosse alterado, então você pode usar o . .bashrc no terminal para fazer com que o .bashrc tenha efeito. é o mesmo que source .bashrc

    
por 05.03.2014 / 07:06
3

Eu acho importante ressaltar que quando você usa . para especificar o diretório atual ou .. para especificar o diretório pai, isso é algo que é geralmente interpretado pelas chamadas de sistema subjacentes usadas pelo shell (ou o programa que executa) em vez de pelo próprio shell. Isso está em contraste com o uso de ~ , que é expandido pelo shell no diretório inicial do usuário quando usado no início de uma palavra.

Existem várias boas respostas aqui, então eu não vou copiá-las além de dizer que, é claro, o caso comum que é interpretado pelo próprio shell é criar um script no mesmo shell em vez de executá-lo em um arquivo separado. processo. Em bash , o source embutido é uma alternativa, no entanto, isso não existe em outros POSIX shells, então você é forçado a usar .

Para adicionar um dos meus, é necessário incluir o ./ no início de um programa ou script que você deseja executar no diretório atual (quando o diretório atual não estiver em PATH ). Por exemplo, ./myscript Embora observe que não é tanto o . quanto a presença do / que faz com que isso funcione. Se / estiver presente, o shell ignorará qualquer tentativa de localização no PATH, etc. (exceto procurando por um alias ) e passará diretamente para o sistema para execução. A única razão para o . é não ter que especificar o caminho completo.

    
por 05.03.2014 / 13:38
3

. também é usado sempre que você precisar apenas especificar o diretório atual. Por exemplo, encontrar um arquivo no diretório atual (e subdiretórios) é como eu chamo find 99% do tempo:

find . -name '*.pdf'

ou:

cp /some/file .

Esse ponto também pode ser um ponto duplo para pesquisar em um diretório.

Então, o que estou tentando dizer, é muito comum especificar diretórios como esse, especialmente o atual.

    
por 05.03.2014 / 09:08
3

executa um script de shell no ambiente atual e, em seguida, retorna (consulte a explicação da IBM aqui ). Se você correr

. ./"yourscripthere"

O script será executado em seu shell real em vez de gerar um novo. Dessa forma, quaisquer alterações feitas por esse script (variável, funções, etc ...) continuarão depois de executá-lo.

    
por 05.03.2014 / 12:55
2

Você geralmente deseja se referir a algum local relativamente ao seu diretório atual.

Se você quiser subir um diretório, simplesmente diga cd .. . Se quiser copiar um arquivo para o diretório atual, você pode dizer cp /some/file . .

Sempre que você precisar especificar algum local, poderá usar um local absoluto, começando com / ou um local relativo. Você não precisa especificar a corrente com frequência, pois muitos comandos são padronizados para ela. (Por exemplo, um simples ls realmente assume ls . .) Outros comandos (como cp ) exigem que você especifique explicitamente o caminho. Nesse caso, . pode ser exatamente o que você deseja.

    
por 05.03.2014 / 07:03
2

Além disso, se houver um arquivo cujo nome comece com - , você não poderá usá-lo como um parâmetro para a maioria dos comandos, pois ele será interpretado como uma opção. Por exemplo. stat -x lança o erro invalid option , mas stat ./-x funciona bem.

    
por 05.03.2014 / 07:33