Apakah ada cara untuk membuat skrip dan membuatnya dapat dieksekusi dalam kode kurang dari ini?

8

Kode saya untuk membuat skrip yang dapat dieksekusi

touch script.sh && echo "echo 'Hello World'" > script.sh && sudo chmod +x script.sh
Sham Fiorin
sumber
2
@ShamFiorin Saya ingin menekankan bagian pertama dari jawaban makanan penutup. Anda harus mencoba menggunakannya dengan sudosangat hemat. Memasuki kebiasaan membuangnya bisa berbahaya. Dalam hal ini Anda memiliki skrip yang Anda buat sehingga Anda dapat melakukan apa pun yang Anda inginkan dengan izin, tidak perlu sudo.
Marie
2
Terkait secara umum: Kiat untuk bermain golf di Bash
Digital Trauma

Jawaban:

18

Anda dapat meninggalkan seluruh touchperintah dan tidak perlu digunakan sudo. Untuk mempersingkat baris perintah lebih lanjut, Anda dapat menggunakan bashHistory Expansion untuk menyimpan nama file yang kedua kalinya, dan menghilangkan spasi yang tidak perlu:

echo "echo 'Hello World'" >script.sh&&chmod +x !#:3

Ekspansi Sejarah menggantikan !#:3dengan kata keempat dari baris perintah saat ini, yang dalam kasus Anda adalah nama file script.sh. Tentu saja ini perlu disesuaikan jika Anda memodifikasi perintah pertama, misalnya:

>script.sh echo "echo 'Hello World'"&&chmod +x !#:1

Perhatikan bahwa skrip yang valid membutuhkan shebang :

>script.sh echo -e "#!/bin/bash\necho 'Hello World'"&&chmod +x !#:1

Jika Anda perlu rantai perintah ini lebih sering saya sarankan mendefinisikan fungsi , dengan cara ini Anda hanya perlu mengetikkan nama fungsi. Cara yang serupa - meskipun lebih panjang - adalah penggunaan variabel yang menyimpan nama file:

f=script.sh;>$f echo "echo 'Hello World'"&&chmod +x $f

Jika nama file Anda mengandung karakter khusus, jangan lupa mengutipnya dengan benar .

pencuci mulut
sumber
20

The installperintah (bagian dari GNU coreutils bersama dengan cp, mv, rm, dll) dapat menyalin file sementara juga pengaturan kepemilikan dan hak akses dan menciptakan direktori induk yang diperlukan. Secara default itu akan membuat file baru dapat dieksekusi. Itu tidak mengerti ' -' tetapi /dev/stdindapat digunakan sebagai gantinya:

install /dev/stdin script.sh <<< "echo Hello World"

Di atas menggunakan 'di sini string ' untuk memberikan teks pada stdin, yang sedikit lebih pendek dari pipa itu. Argumen untuk echotidak perlu mengutip kecuali mereka mengandung karakter dengan makna khusus.

deltab
sumber
perhatikan bahwa herestring adalah Bashism - heredoc akan mudah dibawa
Steven Penny
3
Ide bagus. Anda juga bisa menggunakan subtitusi proses :install <(echo echo Hello World) script.sh
Digital Trauma
8

Saya lebih suka menggunakan catuntuk tugas-tugas seperti ini:

cat > script.sh && chmod +x script.sh
#!/bin/sh
echo 'Hello World'Enter
Ctrl+D
Steeldriver
sumber
1

Anda juga bisa meninggalkan seluruh chmod dan menggunakan umask sebagai gantinya sebelum gema. Harus menghemat beberapa byte. Shebang adalah opsional selama Anda menggunakan perintah yang dipahami oleh setiap shell (terutama bourne dan C).

GrumpyGuru
sumber
5
Bagaimana tepatnya Anda melakukannya?
wjandrea
Tidak mungkin untuk menggunakan umaskpengaturan bit yang dapat dieksekusi secara default ...
Ravexina