Cygwin - cd dalam skrip bash

12

Saya baru menggunakan Cygwin, jadi minta maaf jika ini adalah pertanyaan yang sangat pemula.

Saya memiliki skrip bash di mana saya "cd" ke direktori kemudian melakukan sesuatu di direktori itu. Namun, perintah cd gagal dengan "Tidak ada file atau direktori / c / code / bla / bla".

Jika saya menyalin baris cd langsung ke prompt shell, maka itu berfungsi dengan baik. Itu hanya gagal dalam skrip.

Seperti yang diminta, saya telah menambahkan baris sebenarnya dari skrip:

#!/bin/bash
cd /c/Code/Project

Terima kasih atas bantuannya,
Dan.

Dan
sumber
1
Bisakah Anda memposting baris aktual dari skrip?
Dijeda sampai pemberitahuan lebih lanjut.

Jawaban:

18

Jenis akhiran seperti apa yang dimiliki skrip Anda? Agar skrip bash Cygwin berfungsi dengan baik (tanpa harus menetapkan opsi khusus), skrip bash Cyrwin harus memiliki ujung garis Unix (LF) daripada ujung garis DOS (CR-LF). Jika Anda menyimpan skrip dengan ujung baris DOS, bash akan melihat argumen Anda cdsebagai /c/Code/Project^M, di mana ^MCR, dan tidak akan menemukan direktori dengan nama itu.

Untuk melihat jenis akhir baris itu, Anda bisa menjalankan file scriptname, di mana scriptname adalah nama script Anda. Untuk mengonversi skrip sehingga memiliki akhiran baris Unix, jalankan d2u scriptname.

Jangan gunakan Notepad untuk mengedit skrip bash Cygwin. Itu selalu menyimpan file dengan ujung baris DOS.

garyjohn
sumber
Aha! Itu dia. Saya menggunakan Vim untuk mengeditnya. Terima kasih :-)
Dan
Vim akan bekerja dengan baik. Secara otomatis mendeteksi apakah file memiliki ujung Unix atau DOS dan akan menyimpannya dengan cara yang sama. Secara default, vim Cygwin akan membuat file baru dengan ujung garis Unix, tetapi Windows gvim akan membuat file baru dengan ujung garis DOS. Anda bisa mengubahnya. Lihat :help ffdan :help ffs.
garyjohn
Emacs juga menabung dengan CR-LF. Mengubah gaya akhir-baris di-editor: emacswiki.org/emacs/EndOfLineTips
jfklein
3

Kecuali Anda menimpa, skrip mengeksekusi di salinan shell sendiri (biasanya Bash). Lalu ketika skrip keluar, instance bash itu juga keluar. Jadi skrip CD Anda ke direktori baru dan kemudian keluar, mengembalikan Anda ke Bash asli - yang tidak pernah melakukan CD.

Dua cara untuk mengatasinya. Anda dapat menggunakan alias alih-alih skrip, misalnya di .profile miliki

alias mycd="cd /c/Code/Project"

Cara lain adalah memberi tahu Bash untuk tidak menelurkan subkulit dengan menggunakan sintaks "dot"

. myscript
CarlF
sumber
Anda salah membaca pertanyaan saya. Pesan kesalahan yang saya tanyakan ditulis ke stdout oleh perintah cd, yang ada di dalam skrip. Saya tidak meminta direktori saat ini telah diubah setelah skrip keluar.
Dan
Saya memiliki masalah yang mirip dengan OP tetapi tanpa kesalahan; jawaban ini banyak membantu saya, meskipun bukan "100% sesuai topik".
Frosty Z
2

Anda mungkin menemukan file Anda di / cygdrive / c ...

Xenoaktif
sumber
1

Mencoba:

cd /cygdrive/c/code/blah/blah

Mike Fitzpatrick
sumber
Itu akan bekerja untuk 'cd c:/code/blah/blah'bukan untuk 'cd /c/code/blah/blah'. Juga, c:formulir ' ' juga berfungsi dari sebuah skrip; Ada hal lain yang hilang di sini, pertanyaannya perlu dijabarkan lebih lanjut.
nik
Ini tidak berhasil.
Dan
@ ai the c: form juga tidak berfungsi. Tidak ada yang saya coba bekerja dari skrip. Mereka semua bekerja dari baris perintah.
Dan
1

Saya tidak memiliki reputasi untuk berkomentar atau memilih tetapi jawaban CarlF membantu saya.

"Jadi, skrip CD-mu ke direktori baru lalu keluar, mengembalikanmu ke Bash asli - yang tidak pernah menghasilkan CD."

Skrip yang sama, tetapi dalam kasus saya, tidak ada pesan kesalahan.

Ini bekerja untuk saya:

. myscript.sh

PJ Brunet
sumber