Chạy script trong shell hiện tại mà không có. trước lệnh


26

Nếu một tập lệnh nên được thực thi trong trình bao hiện tại, nó có thể đạt được bằng cách thêm một dấu chấm trước lệnh:

   . ./somescript.sh

Có cách nào để làm điều này mà không cần gõ dấu chấm mỗi lần không? Ví dụ một lệnh để thay đổi sang shell cha từ chính tập lệnh?

Câu trả lời:


22

Nó có thể không chính xác những gì bạn muốn nhưng bạn có thể làm:

alias somescript.sh='. ./somescript.sh'

2
Điều này giải quyết vấn đề của tôi một cách hoàn hảo. Cảm ơn bạn!
alu

8

Có cách nào để làm điều này mà không cần gõ dấu chấm mỗi lần không? Ví dụ một lệnh để thay đổi sang shell cha từ chính tập lệnh?

Tôi không nghĩ là có (ngoài việc gõ source somescript.sh, nhưng đó có lẽ không phải là thứ bạn đang tìm kiếm ^^).

Nếu bạn chạy tập lệnh như bình thường với ./somescript.sh, thì shell forks và thực thi lệnh này. Nó truyền lệnh cho kernel và sau đó kernel quyết định cách thực hiện lệnh này bằng cách phân tích #!dòng bên trong script. Sau đó, kernel khởi chạy trình thông dịch đã chỉ định (trong trường hợp này có thể là một bashlớp con). Do đó, các sửa đổi somescript.shđối với môi trường của nó được phân lập trong lớp con mà không ảnh hưởng đến lớp vỏ mẹ.

Nếu bạn muốn shell tự đọc tập lệnh mà không khởi chạy một tiến trình khác, bạn rõ ràng phải nói với nó bằng cách sử dụng từ khóa .hoặc source.


Cảm ơn vì lời giải thích chi tiết. :) Bây giờ tôi thấy rằng không có cách nào thực hiện điều này từ tập lệnh được gọi, nhưng thật may là shell cha có thể được yêu cầu không tạo ra một nhánh con với aliaslệnh, như scott đề xuất.
alu

1

Nếu bạn thực thi ./somescript.shnhư một chương trình bên ngoài, nó không thể làm bất cứ điều gì trong quy trình shell đang chạy, chẳng hạn như truy cập các biến không xuất, đặt biến, thay đổi thư mục hiện tại, v.v. Không có cách nào khác.

(Chà, ok, bạn có thể chạy trình gỡ lỗi từ quy trình con và điều chỉnh bộ nhớ của tiến trình cha. Nhưng nếu bạn thử nó, kết quả rất có thể là làm hỏng vỏ cha.)

Bạn cần phải chạy . ./somescript.sh. Bạn có thể ẩn nó đằng sau một bí danh hoặc hàm nếu bạn muốn, nhưng một lần nữa định nghĩa bí danh hoặc hàm phải được thực hiện trong vỏ cha.


0

Tôi nghĩ rằng kịch bản bạn đang cố chạy không thể thực thi được. chmod a+x somescript.shsẽ thêm bit thực thi cho người dùng, nhóm và (ugo) khác vào tệp đó. Dòng đầu tiên của tệp cũng sẽ cần #! dòng ở trên cùng, thích #!/bin/bash.

ls -l somescript.shsẽ hiển thị cho bạn các bộ ba rwx (đọc / ghi / thực thi) cho tệp. Nó sẽ cần một x trong ít nhất là tập đầu tiên, giả sử bạn sở hữu tệp.


Các tập lệnh tự hoạt động tốt, nhưng tôi muốn thực thi nó trong trình bao hiện tại để có thể sửa đổi các biến môi trường của trình bao.
alu

Nếu xuất biến mà bạn muốn trong tập lệnh không hoạt động, như export PATH=$PATH:/usr/local/binthêm / usr / local / bin vào $ PATH của bạn, thì bạn cần phải lấy nguồn để thay đổi các biến môi trường đang chạy của mình. Câu hỏi này thực sự là "Làm thế nào để tôi lập trình thay đổi các biến môi trường trong shell đang chạy của mình từ tập lệnh bash?" Kịch bản . ./somescript.shđang thực thi tốt - bạn đang sử dụng lệnh dot để nguồn trong một tệp. tcsh sử dụng "nguồn" cho cùng một thứ.
AR Diederich

Sửa đổi một biến chỉ là một ví dụ. Câu hỏi của tôi là liệu có thể nói với cái vỏ nên có một dấu chấm mà không thực sự viết nó không (ví dụ từ chính kịch bản)
alu

Dấu chấm có thể dễ dàng bị lãng quên có thể thay đổi hoàn toàn hành vi của tập lệnh.
alu

0
export PATH=$PATH:.

Chạy lệnh đó trong shell hoặc thêm nó vào tệp cấu hình shell của bạn sẽ nối thêm thư mục hiện tại vào biến PATH. Biến PATH là một danh sách các thư mục mà shell của bạn sẽ tìm kiếm nhị phân để thực thi khi bạn đưa ra lệnh.

Điều này sẽ cho phép bạn chạy bất kỳ thực thi trong thư mục hiện tại mà không cần ./


1
OP đang hỏi về cái đầu tiên .không phải ./là một phần của tên tệp. Chạy ./somescript không thực thi nó trong trình bao hiện tại . ./somescript.
Anthon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.