Có thể sử dụng lệnh exec là gì?


10

Tôi đang học execlệnh. Tôi biết rằng execlệnh thay thế quá trình đã bắt đầu nó. Vì vậy, không thể quay lại quá trình được thay thế bằng execlệnh.

Người ta có thể nói rằng mục đích của nó là làm cho nó không thể quay lại quá trình bắt đầu nó.

Nhưng những cách sử dụng khác để có một cái gì đó execcó sẵn như là một lệnh là gì?



1
từ bài viết trên wikipedia: "Các tập lệnh Wrapper thường sử dụng lệnh này để chạy một chương trình (trực tiếp hoặc thông qua trình thông dịch hoặc máy ảo) sau khi đặt các biến môi trường hoặc cấu hình khác."
knb

1
phù hợp hơn với Khoa học máy tính
Anwar

2
Cá nhân, tôi thấy exec ssh server-that-does-byobu-on-login.example.comrất hài lòng, trong đó ^ A ^ D tắt hoàn toàn thiết bị đầu cuối. (Nói chung hơn, exec byobu(hoặc exec screen, exec tmux).
Williham Totland

Câu trả lời:


9

Trong tập lệnh bao bọc

exec được sử dụng chủ yếu trong các kịch bản lệnh bao bọc.

Nếu bạn muốn sửa đổi môi trường cho một chương trình trước khi thực hiện chương trình chính, bạn thường viết một tập lệnh và khi kết thúc chương trình đó sẽ bắt đầu chương trình chính. Nhưng không cần kịch bản lưu lại trong bộ nhớ tại thời điểm đó. Vì vậy, execđược sử dụng trong các trường hợp này để chương trình chính có thể thay thế tập lệnh mẹ.

Đây là một ví dụ thực tế của nó. mate-terminal.wrapperKịch bản của nó đi kèm với thiết bị đầu cuối mate. Nó bắt đầu mate-terminalvới một số đối số bổ sung bằng cách kiểm tra môi trường của người dùng.

#!/usr/bin/perl -w

my $login=0;

while ($opt = shift(@ARGV))
{
    if ($opt eq '-display')
    {
        $ENV{'DISPLAY'} = shift(@ARGV);
    }
    elsif ($opt eq '-name')
    {
        $arg = shift(@ARGV);
        push(@args, "--window-with-profile=$arg");
    }
    elsif ($opt eq '-n')
    {
        # Accept but ignore
        print STDERR "$0: to set an icon, please use -name <profile> and set a profile icon\n"
    }
    elsif ($opt eq '-T' || $opt eq '-title')
    {
        push(@args, '-t', shift(@ARGV));
    }
    elsif ($opt eq '-ls')
    {
        $login = 1;
    }
    elsif ($opt eq '+ls')
    {
        $login = 0;
    }
    elsif ($opt eq '-geometry')
    {
        $arg = shift(@ARGV);
        push(@args, "--geometry=$arg");
    }
    elsif ($opt eq '-fn')
    {
        $arg = shift(@ARGV);
        push(@args, "--font=$arg");
    }
    elsif ($opt eq '-fg')
    {
        $arg = shift(@ARGV);
        push(@args, "--foreground=$arg");
    }
    elsif ($opt eq '-bg')
    {
        $arg = shift(@ARGV);
        push(@args, "--background=$arg");
    }
    elsif ($opt eq '-tn')
    {
       $arg = shift(@ARGV);
       push(@args, "--termname=$arg");
    }
    elsif ($opt eq '-e')
    {
        $arg = shift(@ARGV);
        if (@ARGV)
        {
            push(@args, '-x', $arg, @ARGV);
            last;
        }
        else
        {
            push(@args, '-e', $arg);
        }
        last;
    }
    elsif ($opt eq '-h' || $opt eq '--help')
    {
        push(@args, '--help');
    }
}
if ($login == 1)
{
    @args = ('--login', @args);
}
exec('mate-terminal',@args);

Điểm cần chú ý ở đây là, có một execcuộc gọi, thay thế tập lệnh này trong bộ nhớ.

Đây là một câu hỏi tương tự được trả lời trong Trang web StackExchange của Unix & Linux - /unix//q/270929/19288

Để chuyển hướng mô tả tập tin

Một cách sử dụng phổ biến khác execlà trong việc chuyển hướng mô tả tệp. stdin, stdout, stderrCó thể được chuyển hướng đến các tập tin sử dụng exec.

  1. Chuyển hướng stdout- exec 1>filesẽ khiến đầu ra tiêu chuẩn là một tệp được đặt tên filecho cuối phiên shell hiện tại. Bất cứ điều gì để xuất ra màn hình sẽ có trong tập tin.

  2. Chuyển hướng stdin- Nó cũng có thể được sử dụng để chuyển hướng stdinđến một tập tin. Ví dụ: Nếu bạn muốn thực thi tệp tập lệnh script.sh, bạn chỉ có thể chuyển hướng stdintệp đến tệp bằng cách sử dụng exec 0<script.sh.


Được chứ. Sau đó, 'mate-terminal' sẽ có bộ mã lệnh bao bọc? Và sẽ sử dụng bộ nhớ mà tập lệnh bao bọc sử dụng? Vì vậy, kịch bản bao bọc đã biến mất. Nếu không, hai tập lệnh sẽ tồn tại dưới dạng các quy trình riêng biệt trên hệ thống (với hai bộ vi xử lý khác nhau)?
mizech

@mizech vâng. họ sử dụng cùng một PID
Anwar

@mizech Rất vui khi biết điều đó đã giúp :)
Anwar

1
Ví dụ tuyệt vời, điều đó làm cho nó thực sự rõ ràng
Zanna

Câu trả lời này là một phần và bỏ lỡ một trong những cách sử dụng quan trọng (và điển hình) execđó là sử dụng trong việc chuyển hướng mô tả tệp.
heemayl

9

Các exec lệnh thay thế quá trình shell hiện với lệnh quy định. Thông thường, khi bạn chạy một lệnh, một quy trình mới được sinh ra (rẽ nhánh). Các exec lệnh không đẻ trứng một quá trình mới. Thay vào đó, quy trình hiện tại được phủ lên bằng lệnh mới. Nói cách khác, execlệnh được thực thi thay cho shell hiện tại mà không tạo ra một quy trình mới.

Có ba cách sử dụng phổ biến nhất của lệnh exec:

1. Thay thế quá trình

Ví dụ-1: Nếu bạn mở mộtbashvỏmớinhư

$ bash 

trong pstreeđó có vẻ như

Thiết bị đầu cuối
        ├─bash───bash

bashVỏ trước vẫn còn đó và bạn có bashvỏ mới . Trong khi đó, nếu bạn mở một bash shell mới,

$ exec bash

các pstreechương trình

Thiết bị đầu cuối
        ├─bash───pstree

Ở đây cái cũ bashđược thay thế bằng cái mới. Nó đặc biệt hữu ích để thoát khỏi nhiều lần đăng nhập trong một lệnh. Nó an toàn hơn và xóa bỏ cơ hội rời khỏi một thiết bị đầu cuối mở do nhầm lẫn. Xem Thoát khỏi cả root và người dùng bằng một lệnh

Ví dụ-2: bạn có thể mở một tệp như

$ exec vi filename.txt

Khi bạn thoát vi, không cần phải đóng thiết bị đầu cuối riêng vì vỏ đã được thay thế. Ngay khi bạn đóng vi thì thiết bị đầu cuối cũng được đóng lại.

2. Phương pháp chuyển hướng mô tả tệp trong tập lệnh shell

Các exec lệnh cũng có thể được sử dụng trong kịch bản shell động mở, đóng, và sao chép file descriptor. Điều đó cho phép thực hiện chuyển hướng STDIN, STDERR, STDOUT và các bộ mô tả tệp khác sang các tệp khác nhau trong tập lệnh shell, thay vì chuỗi lệnh gọi. Nếu bạn không chỉ định một lệnh hoặc đối số, bạn có thể chỉ định các ký hiệu chuyển hướng và mô tả tệp để thực hiện các chức năng này.

Giả sử bạn có tập lệnh shell script.shmà bạn muốn có tệp nhật ký script.log, bạn có thể sử dụng execnhư,

LOG=/path/to/script.log
exec 1>>$LOG
exec 2>&1

tương đương với

./script &>> /path/to/script.log
./script >>  /path/to/script.log 2>&1

3. Tạo các giai đoạn của quá trình bằng lệnh exec

Bạn cũng có thể sử dụng lệnh exec để tạo một tập lệnh shell thực thi lẫn nhau theo trình tự như các giai đoạn của quy trình. Thay vì sinh ra các tiến trình mới mỗi lần bạn cần chuyển điều khiển sang tập lệnh tiếp theo, bạn thực thi lệnh exec.

Trong trường hợp này, câu lệnh cuối cùng của mỗi giai đoạn nên là execlệnh gọi ra giai đoạn tiếp theo.

Xem việc sử dụng execlệnh trong shell script để biết thêm.

Lưu ý: Một phần ở trên được lấy từ này.


1
Chỉ có câu trả lời đầy đủ (cho đến nay).
heemayl

Tất cả những lần tôi đã sử dụng exec đều cho hiệu quả. Nếu bạn chạy một daemon với exec, bạn chỉ cần có một tiến trình hoạt động thay vì hai. Rời khỏi quá trình bash xung quanh lãng phí một vài MB ram, trong số những thứ khác.
gmatht

2

Theo như tôi biết, nó cũng được sử dụng để chuyển hướng các bộ mô tả tệp (ví dụ: STDOUT, STDERR, STDIN) của tập lệnh bash.

Vì vậy, ví dụ, bạn có thể đọc từ một tệp thay vì từ bàn phím bằng cách sử dụng chuyển hướng STDIN và ghi vào tệp thay vì đầu cuối bằng chuyển hướng STDOUT (hoặc có thể là STDERR tùy theo chương trình).


1
Câu trả lời này một phần và chỉ bổ sung cho câu trả lời này .
heemayl
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.