Jalankan skrip di shell saat ini tanpa. sebelum perintah

26

Jika skrip harus dieksekusi di shell saat ini, itu dapat dicapai dengan menambahkan titik sebelum perintah:

   . ./somescript.sh

Apakah ada cara untuk melakukan ini tanpa mengetik titik setiap kali? Misalnya perintah untuk mengubah shell induk dari skrip itu sendiri?

alu
sumber

Jawaban:

22

Mungkin tidak persis seperti yang Anda inginkan tetapi Anda dapat melakukannya:

alias somescript.sh='. ./somescript.sh'
scott
sumber
2
Ini menyelesaikan masalah saya dengan sempurna. Terima kasih!
alu
8

Apakah ada cara untuk melakukan ini tanpa mengetik titik setiap kali? Misalnya perintah untuk mengubah shell induk dari skrip itu sendiri?

Saya tidak berpikir ada (selain mengetik source somescript.sh, tapi itu mungkin bukan yang Anda cari ^^).

Jika Anda menjalankan skrip seperti biasa ./somescript.sh, maka shell akan bercabang dan mengeksekusi perintah ini. Ini meneruskan perintah ke kernel dan kemudian kernel memutuskan bagaimana perintah ini akan dieksekusi dengan menguraikan #!baris di dalam skrip. Kernel kemudian meluncurkan interpreter yang ditentukan (dalam hal ini mungkin sebuah bashsubkulit). Karenanya modifikasi yang somescript.shdilakukan terhadap lingkungannya terisolasi dalam subkulit tanpa memengaruhi shell induk.

Jika Anda ingin shell membaca skrip itu sendiri tanpa meluncurkan proses lain, Anda harus mengatakannya secara eksplisit dengan menggunakan kata kunci .atau source.

Martin von Wittich
sumber
Terima kasih untuk penjelasan rinci. :) Sekarang saya melihat bahwa tidak ada cara melakukan ini dari skrip yang dipanggil, tetapi untungnya shell induk dapat diberitahu untuk tidak membuat subkulit dengan aliasperintah, seperti yang disarankan scott.
alu
1

Jika Anda menjalankan ./somescript.shsebagai program eksternal, ia tidak dapat melakukan apa pun di dalam proses shell yang sedang berjalan, seperti mengakses variabel yang tidak diekspor, mengatur variabel, mengubah direktori saat ini, dll. Tidak ada jalan lain untuk mengatasi hal ini.

(Ya, baiklah, Anda mungkin dapat menjalankan debugger dari subproses dan mengubah memori proses induk. Tetapi jika Anda mencobanya, hasil yang paling mungkin adalah menabrak shell induk.)

Anda harus berlari . ./somescript.sh. Anda dapat menyembunyikannya di belakang alias atau fungsi jika suka, tetapi sekali lagi alias atau definisi fungsi harus dilakukan di shell induk.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
0

Saya pikir skrip yang Anda coba jalankan tidak dapat dieksekusi. chmod a+x somescript.shakan menambahkan bit eksekusi untuk pengguna, grup, dan lainnya (ugo) ke file itu. Baris pertama file juga perlu #! baris di atas, seperti #!/bin/bash.

ls -l somescript.shakan menampilkan kembar tiga rwx (baca / tulis / eksekusi) untuk file tersebut. Ini akan membutuhkan x setidaknya set pertama, dengan asumsi Anda memiliki file.

AR Diederich
sumber
Skrip itu sendiri berfungsi dengan baik, tetapi saya ingin menjalankannya di shell saat ini untuk dapat memodifikasi variabel lingkungan dari shell.
alu
Jika mengekspor variabel yang Anda inginkan dalam skrip tidak berfungsi, ingin export PATH=$PATH:/usr/local/binmenambahkan / usr / local / bin ke $ PATH Anda, maka Anda perlu sumber file untuk mengubah variabel lingkungan berjalan Anda. Pertanyaan ini benar-benar "Bagaimana saya secara program mengubah variabel lingkungan saya di shell saya yang berjalan dari skrip bash?" Script . ./somescript.shmengeksekusi dengan baik - Anda menggunakan perintah dot untuk sumber dalam file. tcsh menggunakan "sumber" untuk hal yang sama.
AR Diederich
Memodifikasi variabel hanyalah sebuah contoh. Pertanyaan saya adalah apakah mungkin untuk memberi tahu shell harus ada titik tanpa benar-benar menulisnya (misalnya dari skrip itu sendiri)
alu
Titik mungkin mudah dilupakan yang dapat mengubah perilaku skrip sepenuhnya.
alu
0
export PATH=$PATH:.

Menjalankan perintah itu di shell atau menambahkannya ke file konfigurasi shell Anda akan menambahkan direktori saat ini ke variabel PATH. Variabel PATH adalah daftar direktori di mana shell Anda akan mencari binari untuk dieksekusi ketika Anda mengeluarkan perintah.

Ini akan memungkinkan Anda untuk menjalankan executable di direktori saat ini tanpa ./

GabeDain
sumber
1
OP bertanya tentang yang pertama .bukan ./yang merupakan bagian dari nama file. Menjalankan ./scriptcript tidak menjalankannya di shell saat . ./somescriptini seperti halnya.
Anthon