. .bash_profile e. ./.bash_profile (./ e.)

2

Eu entendo que .bash_profile é um arquivo oculto, portanto, o período em frente.

Eu entendo para executar um script no diretório atual. Você deve especificar ./ , mas não tenho certeza, porque já estamos no diretório atual e o script está dentro do diretório atual.

q1) Por que ainda devemos ./ ? Podemos apenas colocar o nome do script?

q2) Qual é a diferença entre . bash_profile e . ./.bash_profile ? O . está se referindo ao diretório atual ou . = sourcing?

==================================

Perguntas adicionais

Abaixo está meu PATH

[oracle@SJOAM scripts]$ echo $PATH
.:/usr/local/java/bin:/usr/local/java/db/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oracle/bin:/u01/app/oracle/product/11.2.0/dbhome_1/bin:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin:/u01/app/oracle/dba_scripts/bin

Como você pode ver, não termina com: e não há espaço depois disso. Eu estou agora no diretório

[oracle@SJOAM bin]$ cd ~/scripts
[oracle@SJOAM scripts]$ pwd
/home/oracle/scripts
[oracle@SJOAM scripts]$ ls
rmanbkp.sh  test.sh

Mas ainda sou capaz de executar test.sh sem especificar ./test.sh / home / oracle / scripts não está dentro do meu $ PATH

=============================

Q1) Por que ainda sou capaz de executar o script sem especificar ./?

Q2) Se o meu $ PATH tem um diretório que não existe, a busca continua pelo resto do PATH?

Q3) Um diretório inválido no diretório $ PATH = current?

    
por Noob 08.07.2015 / 07:20

2 respostas

3

q1

Quando um comando é especificado sem um diretório, o PATH é procurado pelo comando. Se o comando não for encontrado no PATH, uma mensagem de erro será emitida. Isto é para sua segurança e segurança.

Se um comando for especificado com um caminho, o shell assumirá que você sabe o que está fazendo e executa esse comando.

Às vezes, as pessoas colocam o diretório atual no PATH. O PATH é uma lista de diretórios separados por dois pontos. Se um desses diretórios estiver vazio, ele será interpretado como o diretório atual. Por exemplo, neste PATH, o espaço vazio após os últimos dois pontos é interpretado como sendo o diretório atual:

$ echo $PATH
/bin:/usr/bin:/opt/bin:/usr/local/bin:

Com esse PATH, você pode executar um comando no diretório atual sem especificar ./ na frente de seu nome. Esteja ciente, no entanto, de que isso pode levar a uma surpresa desagradável.

q2

Sim, um espaço de ponto principal significa fonte do script. A obtenção de um script significa que ele é executado no shell atual, não em uma subcamada. Um script de origem pode alterar o ambiente atual. Um script em uma subshell não pode. Os dois comandos seguintes são equivalentes:

source ~/.bashrc
. ~/.bashrc

Em resumo, (1) um ponto-espaço inicial na linha de comando significa 'source the script' e (2) um ponto inicial em um nome de arquivo significa que o arquivo está oculto. Esses dois usos do ponto são separados e independentes.

Q1

O primeiro diretório no seu PATH é . , que é o diretório atual. É por isso que você é capaz de executar scripts no diretório atual sem especificar seu diretório.

Como o diretório atual é especificado primeiro, esse PATH é especialmente perigoso: significa que qualquer script no diretório atual terá precedência sobre todos os executáveis padrão em /bin , /usr/bin , etc. Isso pode causar falha de qualquer programa que espera poder executar os executáveis usuais.

Q2

Vamos fazer um teste adicionando um diretório inexistente, chamá-lo de nonsense , para o PATH:

$ type date
date is hashed (/bin/date)
$ export PATH=/usr/bin/:nonsense:/bin
$ hash -r  # delete the cache
$ date
Thu Jul  9 11:13:18 PDT 2015

Caminhos inválidos são ignorados e a pesquisa continua com o próximo elemento na lista PATH.

Q3

Não, os diretórios inválidos no PATH não são interpretados como o diretório atual. Por exemplo:

$ export PATH=/usr/bin/:nonsense
$ date
bash: date: command not found
$ cd /bin
$ date
bash: date: command not found
$ ./date
Thu Jul  9 11:17:34 PDT 2015
    
por 08.07.2015 / 07:33
0

O nome do arquivo é .bash_profile com um ponto principal.

O comando para criar um arquivo no shell atual é . (ponto)

Então, você quer . .bash_profile - (command="."; argument=". bash_profile" ')

Outra maneira de dizer o que pode ser mais óbvio:

filename=".bash_profile"
. "$filename"
    
por 08.07.2015 / 13:23

Tags