Parece que ${DIRECTORY}
está vazio. Nesse caso, toque em ${DIRECTORY}/${FILE}
expandindo para touch /${FILE}
Atualmente, estou aprendendo a escrever scripts simples e não consigo entender um problema muito simples.
Eu tenho o seguinte comando no meu script ...
touch ${DIRECTORY}/${FILE}
Esse comando aparece várias vezes no meu script e funciona bem em todas as instâncias, exceto em uma. Por algum motivo, em um ponto apenas, ele decide incluir a barra no nome do arquivo que está tentando criar e eu recebo o erro ...
cannot touch '/myfile.dat': Permission denied
No começo eu pensei que era apenas para baixo para a minha inexperiência (o que provavelmente é), mas depois de fazer um pouco de pesquisa, eu vi essa linha usada em inúmeros exemplos de trabalho corretamente. Não consigo entender - a mesma linha está funcionando bem em vários outros locais no meu script!
Alguém se preocupa em lançar alguma luz sobre isso? É a inconsistência que está realmente me incomodando. Os comandos que envolvem esse comando específico podem afetar o resultado?
Várias coisas podem estar acontecendo.
DIRECTORY
neste ponto, então o script está executando algo como touch ${DRIECTORY}/${FILE}
. Como DIRECTORY
não está definido, se $FILE
for myfile.dat
, isso se expandirá para touch /${FILE}
(uma variável não definida é tratada como se estivesse vazia). set -u
no topo do script (após a linha #!
). Você pode alternar entre unset-triggers-error e unset-is-empty com set -u
e set +u
. DIRECTORY
não esteja definida ou vazia neste momento. Veja o ponto anterior. touch ${DIRECTORY} /${FILE}
. Em seguida, o comando touch
recebe dois parâmetros, ele opera em ${DIRECTORY}
(que, presumivelmente, é o nome de um diretório existente, configura a hora de modificação desse diretório para a hora atual) e engasga com /${FILE}
. / li>
DIRECTORY
. Por exemplo, se o valor da variável for /some/path
com um espaço no final, então touch
receberá dois parâmetros: /some/path
e /myfile.dat
. Veja o ponto anterior. Seu script não funcionará se DIRECTORY
ou FILE
contiver qualquer caractere de espaço em branco ou globbing \[?*
. Isso porque, quando você escreve, por exemplo $FOO
, isso não se expande apenas para o valor da variável: esse valor é dividido em palavras em cada sequência de espaço em branco, e cada palavra é interpretada como um padrão curinga e substituída por nomes de arquivos correspondentes (se nenhum nome de arquivo corresponder , o padrão é deixado sozinho). Sempre use aspas duplas em torno de substituições de variáveis (e também substituições de comandos). Dentro de aspas duplas, "$FOO"
se expande para apenas o valor de FOO
sem mais mutilações.
touch "$DIRECTORY/$FILE"
(Veja também $ VAR vs $ {VAR} e para citar ou não citar )
Para ter uma ideia melhor do que o script está fazendo, coloque set -x
após a linha #!
. Isso ativou um modo de depuração em que o shell imprime cada comando antes de executá-lo. Você pode ativar e desativar os rastreios de depuração com set -x
e set +x
.