Bagaimana cara saya menjalankan skrip shell tanpa menggunakan perintah "sh" atau "bash"?


261

Saya memiliki skrip shell yang ingin saya jalankan tanpa menggunakan perintah "sh" atau "bash". Sebagai contoh:

Dari pada: sh script.sh

Saya ingin menggunakan: script.sh

Bagaimana saya bisa melakukan ini?

PS (i) Saya tidak banyak menggunakan skrip shell dan saya mencoba membaca tentang alias, tapi saya tidak mengerti bagaimana menggunakannya.

(ii) Saya juga membaca tentang menghubungkan skrip dengan file lain dalam variabel PATH. Saya menggunakan server universitas saya dan saya tidak memiliki izin untuk membuat file di lokasi tersebut.


1
Jawabannya menunjukkan bagaimana membuat skrip dapat dieksekusi, tetapi sepertinya tidak mencakup bagaimana membuatnya bisa diakses. Untuk itu, buat sendiri direktori bin - $HOME/bin- jika Anda belum memilikinya, tambahkan ke PATH Anda (dekat bagian depan). Letakkan skrip (dan program lain) yang ingin Anda jalankan langsung tanpa menentukan pathname di sini, atau symlinks di sini ke tempat program sebenarnya.
Jonathan Leffler

1
Setelah Anda mengikuti jawaban di bawah ini, untuk menjatuhkan ".sh" Anda dapat mengganti nama file: mv example.sh exampledan kemudian exampleharus bekerja sendiri.
PJ Brunet

Jawaban:


434

Tambahkan "shebang" di bagian atas file Anda:

#!/bin/bash

Dan membuat file Anda dapat dieksekusi ( chmod +x script.sh).

Terakhir, ubah jalur Anda untuk menambahkan direktori tempat skrip Anda berada:

export PATH=$PATH:/appropriate/directory

(biasanya, Anda ingin $HOME/binmenyimpan skrip Anda sendiri)


Hai, terima kasih atas balasan Anda. Saya mencobanya. Sekarang saya bisa menjalankannya tanpa perintah "sh". Tapi saya masih harus awalan perintah dengan "./" yang saya tidak mau. :)
Rameez Hussain

5
Lihat komentar tentang jalan. Anda harus meletakkan skrip Anda di direktori yang harus Anda tambahkan ke PATH Anda.
fge

2
itu tidak berfungsi dalam kasus saya. tetapi source script.shbekerja dengan baik, atau lebih tepatnya source <filename_without_any_extension_type>
MycrofD

4
source ./my-cool-script(atau . ./my-cool-script) akan mencemari sesi shell saat ini dengan variabel apa pun yang ditentukan dalam skrip. Sumber tidak boleh digunakan kecuali jika Anda ingin secara eksplisit memodifikasi sesi shell dengan mengatur lingkungan vars, mengubah direktori, dll. Bug yang sangat mengerikan dapat menghasilkan sebaliknya, karena variabel dari satu eksekusi skrip, jika dilakukan melalui sumber, dapat mempengaruhi eksekusi skrip lain.
Daniel Waltrip

3
Jika Anda yakin folder skrip berada di PATH, dan itu masih tidak berfungsi tanpa ./, maka Anda mungkin memiliki tabrakan nama. Coba ganti nama.
chorbs

66

Ini adalah beberapa prasyarat untuk menggunakan nama skrip secara langsung:

  1. Tambahkan she-bang (#!/bin/bash)baris di bagian paling atas.
  2. Menggunakan chmod u+x scriptnamemembuat skrip dapat dieksekusi. (di mana scriptnamenama skrip Anda)
  3. Tempatkan skrip di bawah /usr/local/binfolder.
  4. Jalankan skrip hanya menggunakan nama skrip.

Catatan: Alasan saya menyarankan untuk meletakkannya di bawah /usr/local/binfolder adalah karena kemungkinan besar path itu sudah ditambahkan ke folder Anda PATH variable.

Memperbarui:

Jika Anda tidak memiliki akses ke /usr/local/binfolder kemudian lakukan hal berikut:

  1. Buat folder di direktori home Anda dan mari kita sebut saja myscripts.
  2. Lakukan ls -lartdi direktori home Anda, untuk mengidentifikasi skrip start-up yang digunakan shell Anda. Itu harus .profileatau .bashrc.
  3. Setelah Anda mengidentifikasi skrip start up, tambahkan baris berikut dalam skrip Anda - export set PATH=$PATH:~/myscript.
  4. Setelah ditambahkan, sumber skrip start-up Anda atau keluar dan masuk kembali.
  5. Jalankan skrip Anda menggunakan scriptname.

Saya mencoba melakukan ini tetapi saya tidak memiliki izin untuk mengakses folder / usr / local / bin. Saya menggunakan komputer universitas.
Rameez Hussain

1
Bisakah Anda memberi tahu saya apa yang Anda maksud dengan "sumber skrip start-up Anda"?
Rameez Hussain

1
Sumber skrip start-up berarti menjalankannya sehingga parameter yang baru ditetapkan ke variabel PATH diambil oleh shell. Ini bisa dilakukan dengan melakukan . .bashrc. Artinya, cukup masukkan .diikuti spacedan kemudian nama skrip start-up Anda.
jaypal singh

Saya tidak tahu apa masalahnya dengan sistem ini. Saya membuat skrip shell baru bernama "halo" dengan hanya "gema" halo "" di dalamnya. Saya mengubah izinnya dan mencoba ./hello. Itu tidak berhasil. katanya-
Rameez Hussain

Perubahan apa yang telah Anda buat pada skrip start up?
jaypal singh

20

Pastikan itu dapat dieksekusi, menggunakan chmod +x. Secara default, direktori saat ini tidak ada di PATH Anda, jadi Anda perlu menjalankannya sebagai ./script.sh- atau merujuknya dengan jalur yang berkualitas. Atau, jika Anda benar-benar membutuhkannya saja script.sh, Anda perlu menambahkannya ke PATH Anda. (Anda mungkin tidak memiliki akses untuk memodifikasi jalur sistem, tetapi Anda hampir pasti dapat memodifikasi PATH lingkungan Anda saat ini.) Ini juga mengasumsikan bahwa skrip Anda dimulai dengan sesuatu seperti #!/bin/sh.

Anda juga masih dapat menggunakan alias, yang tidak benar-benar terkait dengan skrip shell tetapi hanya shell, dan sederhana seperti:

alias script.sh='sh script.sh'

Yang akan memungkinkan Anda untuk hanya menggunakan script.sh(secara harfiah - ini tidak akan bekerja untuk *.shfile lain ), bukan sh script.sh.


Hei! Terima kasih untuk balasan Anda. Saya mencoba menggunakan alias sebelumnya. Tetapi tidak ada yang terjadi. Saya meletakkannya segera setelah baris "#! / Usr / local / bin / bash". Apa yang menurut Anda salah?
Rameez Hussain

1
Alias ​​tidak dapat didefinisikan dalam skrip Anda - harus dinyatakan sebagai bagian dari lingkungan Anda saat ini. Jadi jalankan aliasperintah pada prompt shell, dan kemudian alias akan tersedia untuk menjalankan perintah.
ziesemer

17

Dalam contoh ini file akan dipanggil myShell

Pertama-tama kita perlu membuat file ini, kita bisa memulai dengan mengetik berikut ini:

sudo nano myShell

Perhatikan kami tidak meletakkan .sh ekstensi? Itu karena ketika kita menjalankannya dari terminal, kita hanya perlu mengetik myShelluntuk menjalankan perintah kita!

Sekarang, di nano, baris teratas HARUS #!/bin/bash Anda dapat meninggalkan baris baru sebelum melanjutkan.

Untuk demonstrasi saya akan menambahkan dasar Hello World! respons

Jadi, saya ketik yang berikut ini:

echo Hello World!

Setelah itu contoh saya akan terlihat seperti ini:

#!/bin/bash
echo Hello World!

Sekarang simpan file dan kemudian jalankan perintah ini:

sudo chmod +x myShell

Sekarang kita telah membuat file yang dapat dieksekusi kita dapat memindahkannya /usr/bin/dengan menggunakan perintah berikut:

sudo cp myShell /usr/bin/

Hanya untuk memastikan bahwa mesin dapat menjalankannya dengan benar, kita perlu me-reboot mesin

Saya menggunakan sudo shutdown -r now

Selamat! Perintah kami sudah selesai! Di terminal kita bisa mengetik myShelldan seharusnya mengatakanHello World!


1
Anda tidak boleh meletakkan file Anda sendiri di /usr/bin- banyak sistem menghemat /usr/local/binuntuk tujuan ini dan cadangan /usr/binketat untuk OS.
tripleee

Tidak perlu sudo chmodfile Anda sendiri.
tripleee

Tidak perlu me-reboot mesin. Paling-paling Anda harus sumber lagi
Luca Di Liello

14

Anda harus mengaktifkan bit yang dapat dieksekusi untuk program.

chmod +x script.sh

Maka Anda bisa menggunakannya ./script.sh

Anda dapat menambahkan folder ke PATH dalam .bashrcfile Anda (terletak di direktori home Anda). Tambahkan baris ini ke akhir file:

export PATH=$PATH:/your/folder/here

Saya lupa menyebutkan bahwa saya telah menetapkan izin yang tepat. Saya menggunakan perintah "chmod 755 script.sh"
Rameez Hussain

6

Anda dapat mengetikkan sudo install (nama skrip) / usr / local / bin / (apa yang ingin Anda ketik untuk mengeksekusi skrip tersebut)

ex: sudo install quickcommit.sh /usr/local/bin/quickcommit masukkan kata sandi

sekarang dapat berjalan tanpa .sh dan di direktori mana pun


3

Menambahkan . (direktori saat ini) ke variabel PATH Anda.
Anda dapat melakukan ini dengan mengedit file profil Anda.
letakkan baris berikut di file .profile Anda.
PATH=$PATH:.

Pastikan untuk menambahkan #!/bin/bashbaris Shebang ( ) di awal skrip Anda dan buat skrip tersebut dapat dieksekusi (menggunakan chmod +x <File Name>).


0

Berikut ini skrip cadangan saya yang akan memberi Anda gagasan dan otomatisasi:

Server: Ubuntu 16.04 PHP: 7.0 Apache2, Mysql dll ...

# Make Shell Backup Script - Bash Backup Script
    nano /home/user/bash/backupscript.sh
        #!/bin/bash
        # Backup All Start
        mkdir /home/user/backup/$(date +"%Y-%m-%d")
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_rest.zip /etc -x "*apache2*" -x "*php*" -x "*mysql*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_apache2.zip /etc/apache2
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_php.zip /etc/php
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_mysql.zip /etc/mysql
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_rest.zip /var/www -x "*html*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_html.zip /var/www/html
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/home_user.zip /home/user -x "*backup*"
        # Backup All End
        echo "Backup Completed Successfully!"
        echo "Location: /home/user/backup/$(date +"%Y-%m-%d")"

    chmod +x /home/user/bash/backupscript.sh
    sudo ln -s /home/user/bash/backupscript.sh /usr/bin/backupscript

ubah / home / pengguna ke direktori pengguna Anda dan ketik: backupscript di mana saja di terminal untuk menjalankan skrip! (dengan asumsi bahwa / usr / bin ada di jalur Anda)


0

Masukkan "#!/bin/sh"sebelum skrip. Kemudian simpan sebagai script.shcontoh. salin ke $HOME/bin atau $HOME/usr/bin
Direktori dapat berbeda di distro linux yang berbeda tetapi berakhir dengan 'bin' dan berada di direktori home cd $HOME/bin atau $HOME/usr/bin
Ketik chmod 700 script.sh
Dan Anda dapat menjalankannya hanya dengan mengetik run.sh di terminal. Jika tidak berhasil, coba chmod +x run.sh alih-alih chmod 700 run.sh


Bagian dari jawaban ini yang tidak menyajikan kembali informasi dari jawaban yang sudah sangat lama bingung.
tripleee

0

Jadikan file apa saja sebagai executable


Katakanlah Anda memiliki file yang dapat dieksekusi yang disebut migrate_linux_amd64 dan Anda ingin menjalankan file ini sebagai perintah seperti "migrasi"

  1. Pertama menguji file yang dapat dieksekusi dari lokasi file:
[oracle@localhost]$ ./migrate.linux-amd64 
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version
  1. Pastikan Anda telah menjalankan hak istimewa pada file
    -rwxr-xr-x 1 oracle oinstall 7473971 May 18 2017 migrate.linux-amd64
    jika tidak, jalankanchmod +x migrate.linux-amd64

  2. Kemudian salin file Anda ke /usr/local/bin. Direktori ini dimiliki oleh root, gunakan sudo atau alihkan ke root dan lakukan operasi berikut

sudo cp migrate.linux-amd64 /usr/local/bin
sudo chown oracle:oracle /user/local/bin/migrate.linux.amd64
  1. Kemudian buat tautan simbolis seperti di bawah ini
sudo ln /usr/local/bin/migrate.linux.amd64 /usr/local/bin/migrate
sudo chown oracle:oracle /usr/local/bin/migrate
  1. Terakhir, tambahkan / usr / local / bin ke jalur atau profil pengguna Anda
export PATH = $PATH:/usr/local/bin
  1. Kemudian jalankan perintah sebagai "migrasi"
[oracle@localhost]$ migrate
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.