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?
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 sebuahbash
subkulit). Karenanya modifikasi yangsomescript.sh
dilakukan 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
.
atausource
.sumber
alias
perintah, seperti yang disarankan scott.Jika Anda menjalankan
./somescript.sh
sebagai 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.sumber
Saya pikir skrip yang Anda coba jalankan tidak dapat dieksekusi.
chmod a+x somescript.sh
akan 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.sh
akan menampilkan kembar tiga rwx (baca / tulis / eksekusi) untuk file tersebut. Ini akan membutuhkan x setidaknya set pertama, dengan asumsi Anda memiliki file.sumber
export PATH=$PATH:/usr/local/bin
menambahkan / 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.sh
mengeksekusi dengan baik - Anda menggunakan perintah dot untuk sumber dalam file. tcsh menggunakan "sumber" untuk hal yang sama.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
./
sumber
.
bukan./
yang merupakan bagian dari nama file. Menjalankan ./scriptcript tidak menjalankannya di shell saat. ./somescript
ini seperti halnya.