Saya melakukan hal berikut di dalam file make
pushd %dir_name%
dan saya mendapatkan kesalahan berikut
/bin/sh : pushd : not found
Bisakah seseorang memberi tahu saya mengapa kesalahan ini muncul? Saya memeriksa variabel $ PATH saya dan mengandung / bin jadi saya tidak berpikir itu menyebabkan masalah.
pushd
. Apakah pushd ada di dalam Anda$PATH
?Jawaban:
pushd
adalahbash
peningkatan pada Bourne Shell yang ditentukan oleh POSIX.pushd
tidak dapat dengan mudah diimplementasikan sebagai perintah, karena direktori kerja saat ini adalah fitur dari proses yang tidak dapat diubah oleh proses anak. (pushd
Perintah hipotetis mungkin melakukanchdir(2)
panggilan dan kemudian memulai shell baru, tetapi ... itu tidak akan terlalu bisa digunakan.)pushd
Adalah shell bawaan, sama seperticd
.Jadi, ubah skrip Anda untuk memulai
#!/bin/bash
atau simpan direktori kerja saat ini dalam variabel, lakukan pekerjaan Anda, lalu ubah kembali. Tergantung apakah Anda menginginkan skrip shell yang bekerja pada sistem yang sangat berkurang (katakanlah, server build Debian) atau jika Anda baik-baik saja selalu membutuhkanbash
.sumber
SHELL = /bin/bash
daripada memulai skrip dengan#!/bin/bash
.test1
di jawaban saya, stackoverflow.com/questions/5193048/bin-sh-pushd-not-found/… .#!/bin/bash
baris pertama file tersebut.Menambahkan
di bagian atas makefile Anda, saya menemukannya di pertanyaan lain Bagaimana cara menggunakan sintaks Bash di target Makefile?
sumber
Solusi untuk ini adalah memiliki variabel untuk mendapatkan direktori kerja saat ini. Kemudian Anda dapat cd keluar untuk melakukan apa pun, lalu ketika Anda membutuhkannya, Anda dapat kembali masuk.
yaitu
sumber
cd
masuk ke direktori yang Anda inginkan dan setelah itu melakukannyacd -
, tidak perlu menggunakan$oldpath
variabel itu jika Anda tidak akan menggunakancd
inbetween. Hal yang menarik tentangpushd
adalah bahwa setiap kali Anda menggunakannya, Anda mendorong direktori ke dalam tumpukan, dan setelah itu Anda dapat kembali ke yang terbaru menggunakanpopd
, jadi masuk akal untuk menggunakannya ketika Anda masuk ke lebih dari satu direktori dan ingin jalan kembali yang pasti.(cd /new_path ; command )
Ini karena pushd adalah fungsi bawaan di bash. Jadi tidak terkait dengan variabel PATH dan juga tidak didukung oleh / bin / sh (yang digunakan secara default oleh make. Anda dapat mengubahnya dengan menyetel SHELL (meskipun tidak akan bekerja secara langsung (test1)).
Anda malah bisa menjalankan semua perintah melalui
bash -c "..."
. Itu akan membuat perintah, termasuk pushd / popd, berjalan di lingkungan bash (test2).Saat menjalankan make test1 dan make test2 memberikan yang berikut ini:
Untuk test1, meskipun bash digunakan sebagai shell, setiap perintah / baris dalam aturan dijalankan dengan sendirinya, sehingga perintah pushd dijalankan di shell yang berbeda dengan popd.
sumber
tcsh
(dan mungkincsh
?) Mengakhiri>
$ tcsh haig:/> exit $ csh haig:/> exit $
(\u) \h:\w>
tetapi saya baru saja melepaskannya ke string generik sekarang untuk jawabannya. Prompt di DOS juga diakhiri dengan>
default ($P$G
IIRC), dan saya suka itu.Shell Anda (/ bin / sh) mencoba mencari 'pushd'. Tetapi tidak dapat menemukannya karena 'pushd', 'popd' dan perintah lain seperti itu dibuat di bash.
Luncurkan skrip Anda menggunakan Bash (/ bin / bash) daripada Sh seperti yang Anda lakukan sekarang, dan itu akan berhasil
sumber
Lalu pilih
no
.sumber
Mensintesis dari tanggapan lain:
pushd
bersifat khusus bash dan Anda membuat menggunakan shell POSIX lain. Ada solusi sederhana untuk menggunakan shell terpisah untuk bagian yang membutuhkan direktori berbeda, jadi coba ubah ke:(Saya mengganti jalur panjang dengan perluasan variabel. Saya mungkin adalah salah satu di makefile dan secara jelas meluas ke direktori saat ini).
Karena Anda menjalankannya dari make, saya mungkin akan mengganti tes dengan aturan make juga. Hanya
(hilangkan awalan direktori saat ini; Anda masih menggunakan jalur relatif di beberapa titik) Dan daripada hanya membuat aturan bergantung
gen/SvcGenLog
. Ini akan sedikit lebih mudah dibaca dan Anda dapat membuatnya bergantunggenscript/genmakefile.pl
juga, jadiMakefile
ingen
akan dibuat ulang jika Anda memodifikasi skrip. Tentu saja jika ada hal lain yang memengaruhi kontenMakefile
, Anda dapat membuat aturan bergantung padanya juga.sumber
Perhatikan bahwa setiap baris yang dieksekusi oleh file make tetap dijalankan di cangkangnya sendiri. Jika Anda mengubah direktori, itu tidak akan mempengaruhi baris berikutnya. Jadi Anda mungkin hanya memiliki sedikit kegunaan untuk pushd dan popd, masalah Anda lebih kebalikannya, yaitu membuat direktori tetap berubah selama Anda membutuhkannya!
sumber
Jalankan "apt install bash" Ini akan menginstal semua yang Anda butuhkan dan perintah akan bekerja
sumber
berikut adalah metode untuk menunjukkan
sh -> pesta
jalankan perintah ini di terminal
Setelah ini, Anda akan melihatnya
arahkan ke / bin / bash (dan bukan ke / bin / tanda hubung)
Referensi
sumber
Ini harus melakukan trik:
Tanda kurung memulai cangkang anak baru, sehingga
cd
mengubah direktori di dalam anak saja, dan perintah apa pun setelahnya di dalam tanda kurung akan berjalan di folder itu. Setelah Anda keluar dari tanda kurung, Anda kembali ke tempat Anda sebelumnya ..sumber