sumber skrip bash: Tidak ada file atau direktori seperti itu

9

Saya memiliki skrip yang dimulai seperti ini

#!/bin/bash
VALKYRIE=~/myProjects/valkyrie
source $VALKYRIE/cluster.conf

tetapi ketika saya menjalankannya ia kembali line 2: ~/myProjects/valkyrie/cluster.conf: No such file or directory

tetapi file itu ada dan ketika saya menjalankannya source ~/myProjects/valkyrie/cluster.confberjalan dengan baik. Ada ide? Saya mengatur VALKYRIEvariabel di tempat lain sehingga hard-code di jalan bukanlah pilihan.

Khoi
sumber
Saya tidak 100% yakin apakah ini akan membantu, tetapi Anda dapat mencoba sepenuhnya mengutip variabel, jika ada spasi di ~. Karenanya source "${VALKYRIE}/cluster.conf",.
Sparhawk
tidak, itu tidak membantu.
Khoi
1
Saya pikir itu ada hubungannya dengan ~tidak berkembang dengan baik. Ketika saya menjalankan skrip Anda dengan jalur yang sengaja dibuat-buat, kesalahannya tidak mengatakan ~, tetapi memperluas jalurnya. Bisakah Anda mencoba mengganti ~dalam skrip Anda dengan jalur absolut? Coba juga menjalankan yang berikut ini dalam sebuah skrip echo ~.
Sparhawk
2
Anda juga bisa mencoba $HOMEbukan ~.
Sparhawk
3
@ Koi Itu menjelaskannya. ~/.pam_environmentbukan skrip shell, jadi ia tidak melakukan hal-hal umum yang Anda harapkan dari shell, seperti ekspansi tilde dan ekspansi parameter, jadi tidak ~juga tidak $HOMEakan diganti. Jika Anda memindahkan baris itu ~/.profilesebagai gantinya, dan menambahkan export di depan, itu akan berfungsi.
geirha

Jawaban:

8

~tampaknya tidak berkembang dengan baik. Ketika saya menjalankan skrip Anda dengan jalur yang sengaja dibuat-buat, kesalahannya tidak mengatakan ~, tetapi perluas jalurnya (mis . /home/sparhawk/fakepathTidak ~/fakepath. Anda bisa mencoba menggunakan $HOMEsebagai gantinya ~, atau menggunakan path lengkap dalam skrip sebagai gantinya.

(Saya tidak yakin mengapa ~tidak bekerja pada sistem Anda, karena skrip Anda berfungsi dengan baik untuk saya.)

Sparhawk
sumber
Ketika Anda melihat urutan bash melakukan ekspansi ( gnu.org/software/bash/manual/bashref.html#Shell-Expansions ), Anda akan melihat bahwa ekspansi tilde terjadi sebelum ekspansi variabel. Itu sebabnya $HOMElebih baik daripada ~di variabel
glenn jackman
@glennjackman Saya tidak yakin saya mengerti. Mengapa prioritas penting untuk variabel vs ~?
Sparhawk
1
itu bukan "prioritas", itu hanya apa yang didahulukan. Pertimbangkan x="~/.bashrc"; ls $x- dalam urutan ekspansi untuk perintah "ls", bash mencari tilde dan tidak menemukannya; akhirnya bash melihat variabel dan mengembangkannya. bash tidak kembali dan mencari tildes lagi, pada titik ini hanya karakter biasa. dan tidak ada file di direktori saat ini yang dimulai dengan tilde.
glenn jackman
Ah baiklah. Saya rasa saya mengerti. Saya selalu bertanya-tanya mengapa perintah itu gagal dan x=~/".bashrc"; ls $xberhasil. Terimakasih atas infonya.
Sparhawk