Saya sedang menulis skrip bash. Saya membutuhkan direktori kerja saat ini untuk selalu menjadi direktori tempat skrip berada.
Perilaku default adalah bahwa direktori kerja saat ini dalam skrip adalah dari shell tempat saya menjalankannya, tapi saya tidak ingin perilaku ini.
myscript path/to/file
saya berharap skrip untuk mengevaluasi path / ke / file relatif ke direktori MY saat ini, bukan direktori apa pun yang terjadi skrip yang akan berlokasi di. Juga, apa yang akan Anda memiliki terjadi untuk script dijalankan denganssh remotehost bash < ./myscript
sebagai BASH FAQ menyebutkan?cd "${BASH_SOURCE%/*}" || exit
Jawaban:
sumber
$0
. Dalam skrip Anda, Anda mungkin berharap, misalnya,../../
untuk merujuk ke direktori dua tingkat di atas lokasi skrip, tetapi ini tidak selalu terjadi jika tautan simbolik sedang dimainkan../script
,.
adalah direktori yang benar, dan mengubahnya.
juga akan berakhir di direktori di manascript
berada, yaitu di direktori kerja saat ini.bash script.sh
, maka nilainya$0
adalahscript.sh
. Satu-satunya caracd
perintah akan "bekerja" untuk Anda adalah karena Anda tidak peduli dengan perintah yang gagal. Jika Anda menggunakanset -o errexit
(alias:)set -e
untuk memastikan bahwa skrip Anda tidak melewati perintah yang gagal, ini TIDAK akan berhasil karenacd script.sh
ada kesalahan. Cara [khusus bash] yang dapat diandalkan adalahcd "$(dirname ${BASH_SOURCE[0]})"
Berikut ini juga berfungsi:
Sintaksnya dijelaskan secara menyeluruh dalam jawaban StackOverflow ini .
sumber
bash script.sh
-$0
hanya akan menjadi nama fileCoba satu kalimat sederhana berikut:
Untuk semua UNIX / OSX / Linux
Pesta
Catatan: Tanda hubung ganda (-) digunakan dalam perintah untuk menandakan akhir dari opsi perintah, sehingga file yang berisi tanda hubung atau karakter khusus lainnya tidak akan melanggar perintah.
Catatan: Di Bash, gunakan yang
${BASH_SOURCE[0]}
mendukung$0
, jika tidak jalur tersebut dapat rusak saat mengambilnya (source
/.
).Untuk Linux, Mac dan * BSD lainnya:
Catatan:
realpath
harus diinstal di distribusi Linux paling populer secara default (seperti Ubuntu), tetapi dalam beberapa itu bisa hilang, jadi Anda harus menginstalnya.Catatan: Jika Anda menggunakan Bash, gunakan yang
${BASH_SOURCE[0]}
mendukung$0
, jika tidak, jalur tersebut dapat rusak saat mengambilnya (source
/.
).Kalau tidak, Anda bisa mencoba sesuatu seperti itu (itu akan menggunakan alat pertama yang ada):
Khusus untuk Linux:
Menggunakan tautan baca GNU pada * BSD / Mac:
Catatan: Anda harus
coreutils
menginstal (mis. 1. Instal Homebrew , 2.brew install coreutils
).Di bash
Dalam bash, Anda dapat menggunakan Parameter Expansions untuk mencapai itu, seperti:
tetapi tidak berfungsi jika skrip dijalankan dari direktori yang sama.
Atau Anda dapat mendefinisikan fungsi berikut di bash:
Fungsi ini membutuhkan 1 argumen. Jika argumen sudah memiliki path absolut, cetaklah sebagaimana adanya, jika tidak, cetak
$PWD
argumen variabel + nama file (tanpa./
awalan).atau di sini adalah versi yang diambil dari
.bashrc
file Debian :Terkait:
Bagaimana cara mendeteksi direktori saat ini di mana saya menjalankan skrip shell saya?
Dapatkan direktori sumber skrip Bash dari dalam skrip itu sendiri
Bash script absolute path dengan OS X
Cara yang andal untuk skrip Bash untuk mendapatkan path lengkap ke skrip itu sendiri
Lihat juga:
Bagaimana saya bisa mendapatkan perilaku readlink -f GNU di Mac?
sumber
cp
perintah, @kenorb?--
) digunakan dalam perintah untuk menandakan akhir dari opsi perintah, sehingga file yang mengandung tanda hubung atau karakter khusus lainnya tidak akan melanggar perintah. Coba misalnya membuat file viatouch "-test"
dantouch -- -test
, lalu hapus file viarm "-test"
danrm -- -test
, dan lihat perbedaannya.realpath
paket Debian yang ditinggalkan, bukan GNUrealpath
. Jika menurut Anda tidak jelas, Anda dapat menyarankan hasil edit.Mudah. Berhasil.
sumber
cd "${BASH_SOURCE%/*}" || exit
Jawaban yang diterima berfungsi dengan baik untuk skrip yang belum disinkronkan di tempat lain, seperti ke
$PATH
.Namun jika skrip dijalankan melalui symlink,
Ini akan cd ke
~/bin/
direktori dan bukan~/project/
direktori, yang mungkin akan memecah skrip Anda jika tujuancd
adalah untuk memasukkan dependensi relatif terhadap~/project/
Jawaban aman symlink adalah di bawah ini:
readlink -f
diperlukan untuk menyelesaikan jalur absolut dari file yang berpotensi disinkronkan.Kutipan diperlukan untuk mendukung filepath yang berpotensi mengandung spasi putih (praktik buruk, tetapi tidak aman untuk menganggap ini tidak akan terjadi)
sumber
Skrip ini sepertinya berfungsi untuk saya:
Baris perintah pwd menggemakan lokasi skrip sebagai direktori kerja saat ini di mana pun saya menjalankannya.
sumber
realpath
tidak mungkin dipasang di mana-mana. Yang mungkin tidak masalah, tergantung situasi OP.realpath
tetapi memilikireadlink
yang tampaknya serupa.Dapatkan jalur nyata ke skrip Anda
(Ini adalah jawaban untuk pertanyaan saya yang sama di sini: Dapatkan nama direktori tempat skrip dijalankan )
sumber
sumber
PWD adalah variabel lingkungan.
sumber
Jika Anda hanya perlu mencetak direktori kerja sekarang maka Anda dapat mengikuti ini.
Berikan izin eksekusi:
Kemudian jalankan skrip pada
./test
saat itu Anda dapat melihat direktori kerja saat ini.sumber
pwd
? Sepertinya banyak tombol yang terbuang sia-sia bagi saya.