侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux exec命令教程:如何执行和替换命令(附实例详解和注意事项)

Linux exec命令介绍

exec命令是一个内置的shell命令,它用来执行一个可执行文件,并用该文件替换当前的shell进程。这样,当执行完该文件后,shell进程就不再存在,也就不会返回到原来的shell环境中。exec命令可以提高系统的性能,因为它减少了创建新进程的开销。exec命令还可以用来修改当前shell的环境变量,文件描述符,信号处理等设置。

Linux exec命令适用的Linux版本

exec命令是一个通用的Linux命令,它适用于所有的Linux发行版,包括Ubuntu,Debian,Fedora,CentOS,RedHat等。exec命令不需要安装,它是shell的一部分,常见的shell有bash,zsh,ksh,csh等。不同的shell可能有一些细微的差别,比如选项,语法,行为等。你可以通过echo $SHELL命令查看你当前使用的shell,或者通过man exec命令查看你当前shell的exec命令的手册。

Linux exec命令的基本语法

exec命令的基本语法如下:

exec [options] [command] [arguments]

如果没有指定command,那么exec命令会修改当前shell的环境变量,文件描述符,信号处理等设置,根据options的不同。如果指定了command,那么exec命令会执行该command,并用它替换当前的shell进程。如果command不存在或者不可执行,那么exec命令会返回一个非零的退出码,并且不会替换当前的shell进程。

Linux exec命令的常用选项或参数说明

exec命令的常用选项或参数如下表所示:

选项参数说明
-aname用name作为command的名称,而不是command本身
-c在执行command之前,清除所有的环境变量,只保留SHELL,TERM,USER,HOME,PATH等几个基本的变量
-l在执行command之前,给command的名称加上一个破折号-,这样可以模拟一个登录shell的行为
-s如果command是一个shell脚本,那么用当前的shell来执行它,而不是用脚本中指定的shell
+n关闭文件描述符n,n是一个整数,表示文件描述符的编号
-n打开文件描述符n,n是一个整数,表示文件描述符的编号
n<&word把文件描述符n重定向到word指定的文件或者文件描述符,word可以是一个文件名,或者一个&后面跟着一个文件描述符的编号
n>&word把文件描述符n重定向到word指定的文件或者文件描述符,word可以是一个文件名,或者一个&后面跟着一个文件描述符的编号
n<>word把文件描述符n重定向到word指定的文件,以读写的方式打开,word必须是一个文件名

Linux exec命令的实例

实例1:执行一个可执行文件,并用它替换当前的shell进程

[linux@bashcommandnotfound.cn ~]$ exec /bin/ls
a.txt b.txt c.txt
[linux@bashcommandnotfound.cn ~]$ # 这里不会返回到原来的shell,因为已经被ls替换了

实例2:执行一个shell脚本,并用它替换当前的shell进程

[linux@bashcommandnotfound.cn ~]$ cat test.sh
#!/bin/bash
echo "This is a test script"
[linux@bashcommandnotfound.cn ~]$ chmod +x test.sh
[linux@bashcommandnotfound.cn ~]$ exec ./test.sh
This is a test script
[linux@bashcommandnotfound.cn ~]$ # 这里不会返回到原来的shell,因为已经被test.sh替换了

实例3:修改当前shell的环境变量

[linux@bashcommandnotfound.cn ~]$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
[linux@bashcommandnotfound.cn ~]$ exec PATH=$PATH:/opt/bin
[linux@bashcommandnotfound.cn ~]$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/bin
[linux@bashcommandnotfound.cn ~]$ # 这里会返回到原来的shell,因为没有执行其他的命令

实例4:修改当前shell的文件描述符

[linux@bashcommandnotfound.cn ~]$ exec 3>output.txt # 打开文件描述符3,并重定向到output.txt
[linux@bashcommandnotfound.cn ~]$ echo "Hello" >&3 # 把输出写入到文件描述符3
[linux@bashcommandnotfound.cn ~]$ cat output.txt
Hello
[linux@bashcommandnotfound.cn ~]$ exec 3>&- # 关闭文件描述符3
[linux@bashcommandnotfound.cn ~]$ echo "World" >&3 # 这里会报错,因为文件描述符3已经关闭了
bash: 3: Bad file descriptor

实例5:用指定的名称执行一个命令

[linux@bashcommandnotfound.cn ~]$ exec -a myname /bin/ps
  PID TTY          TIME CMD
  123 pts/0    00:00:00 bash
  456 pts/0    00:00:00 myname
  789 pts/0    00:00:00 ps
[linux@bashcommandnotfound.cn ~]$ # 这里不会返回到原来的shell,因为已经被ps替换了,注意CMD列显示的是myname,而不是ps

实例6:清除所有的环境变量,只保留几个基本的变量

[linux@bashcommandnotfound.cn ~]$ env | wc -l
23 # 当前有23个环境变量
[linux@bashcommandnotfound.cn ~]$ exec -c env | wc -l
7 # 清除所有的环境变量后,只剩下7个基本的变量
[linux@bashcommandnotfound.cn ~]$ # 这里不会返回到原来的shell,因为已经被env替换了

实例7:模拟一个登录shell的行为

[linux@bashcommandnotfound.cn ~]$ exec -l /bin/bash
[linux@bashcommandnotfound.cn ~]$ echo $0
-bash # 注意名称前面有一个破折号-
[linux@bashcommandnotfound.cn ~]$ exit # 退出当前的shell
[linux@bashcommandnotfound.cn ~]$ # 这里不会返回到原来的shell,因为已经被bash替换了

实例8:用当前的shell执行一个shell脚本

[linux@bashcommandnotfound.cn ~]$ cat test.sh
#!/bin/zsh
echo "This is a test script"
[linux@bashcommandnotfound.cn ~]$ chmod +x test.sh
[linux@bashcommandnotfound.cn ~]$ exec -s ./test.sh
This is a test script
[linux@bashcommandnotfound.cn ~]$ # 这里不会返回到原来的shell,因为已经被test.sh替换了,注意这里用的是bash,而不是zsh

实例9:执行一个不存在或者不可执行的文件

[linux@bashcommandnotfound.cn ~]$ exec /bin/foo
bash: exec: /bin/foo: No such file or directory
[linux@bashcommandnotfound.cn ~]$ # 这里会返回到原来的shell,因为exec命令执行失败了
[linux@bashcommandnotfound.cn ~]$ exec /etc/passwd
bash: exec: /etc/passwd: Permission denied
[linux@bashcommandnotfound.cn ~]$ # 这里会返回到原来的shell,因为exec命令执行失败了

实例10:执行一个命令,并传递一些参数

[linux@bashcommandnotfound.cn ~]$ exec /bin/echo "Hello World"
Hello World
[linux@bashcommandnotfound.cn ~]$ # 这里不会返回到原来的shell,因为已经被echo替换了,注意参数要用引号括起来,否则会被shell解释

实例11:执行一个命令,并重定向输入和输出

[linux@bashcommandnotfound.cn ~]$ exec /bin/cat < input.txt > output.txt
[linux@bashcommandnotfound.cn ~]$ # 这里不会返回到原来的shell,因为已经被cat替换了,注意重定向符号要放在command后面,否则会被shell解释

实例12:执行一个命令,并忽略某些信号

[linux@bashcommandnotfound.cn ~]$ exec - SIGINT /bin/sleep 10
[linux@bashcommandnotfound.cn ~]$ # 这里不会返回到原来的shell,因为已经被sleep替换了,注意-后面要跟一个空格,然后是信号的名称,可以用kill -l命令查看所有的信号,这样可以让command忽略该信号,比如按Ctrl+C不会中断sleep

实例13:执行一个命令,并设置某些信号的处理方式

[linux@bashcommandnotfound.cn ~]$ exec - SIGINT=ignore /bin/sleep 10
[linux@bashcommandnotfound.cn ~]$ # 这里不会返回到原来的shell,因为已经被sleep替换了,注意-后面要跟一个空格,然后是信号的名称,再跟一个等号,然后是信号的处理方式,可以是ignore,default,或者一个函数名,这样可以让command自定义该信号的处理方式,比如按Ctrl+C不会中断sleep

实例14:执行一个命令,并设置某些环境变量

[linux@bashcommandnotfound.cn ~]$ exec - FOO=bar /bin/echo $FOO
bar
[linux@bashcommandnotfound.cn ~]$ # 这里不会返回到原来的shell,因为已经被echo替换了,注意-后面要跟一个空格,然后是环境变量的名称,再跟一个等号,然后是环境变量的值,这样可以让command使用该环境变量,而不影响原来的shell的环境变量

实例15:执行一个命令,并设置某些选项

[linux@bashcommandnotfound.cn ~]$ exec - -x /bin/echo "Hello World"
+ /bin/echo 'Hello World'
Hello World
[linux@bashcommandnotfound.cn ~]$ # 这里不会返回到原来的shell,因为已经被echo替换了,注意-后面要跟一个空格,然后是一个破折号-,再跟一个空格,然后是command,这样可以让command使用shell的某些选项,比如-x表示显示执行的命令

Linux exec命令的注意事项

  • exec命令会替换当前的shell进程,所以执行完command后,不会返回到原来的shell环境中,除非command不存在或者不可执行,或者没有指定command。这意味着如果你在一个shell脚本中使用exec命令,那么exec命令后面的代码都不会执行,除非exec命令失败了。所以,一般在shell脚本中使用exec命令时,要把它放在最后一行,或者在exec命令前面加上exit命令,以防止后面的代码被误执行。
  • exec命令会修改当前shell的环境变量,文件描述符,信号处理等设置,如果没有指定command,或者指定了一些选项。这些修改会影响当前shell的行为,所以要谨慎使用,或者在使用之前保存原来的设置,以便恢复。
  • exec命令会用command的名称作为当前shell的名称,除非使用了-a选项,指定了一个不同的名称。这会影响一些命令的输出,比如ps,top等,它们会显示当前shell的名称。如果你想保持原来的shell的名称,可以使用-a选项,指定和原来一样的名称。
  • 如果你在exec命令中使用了变量,那么要注意变量的展开顺序。一般来说,shell会先展开exec命令中的变量,然后再执行exec命令,这样就可以把变量的值传递给command。但是,如果你在exec命令中使用了单引号,那么shell会把单引号里面的内容当作字面量,不会展开其中的变量,这样就会把变量的名称传递给command,而不是变量的值。所以,如果你想让command使用变量的值,而不是变量的名称,就要用双引号,而不是单引号,或者不用引号。

Linux exec命令的快捷键

exec命令没有特定的快捷键,但是有一些通用的快捷键,可以用来操作exec命令,或者和exec命令配合使用,比如:

  • Ctrl+C:中断当前的命令,如果当前的命令是exec命令,那么就会中断exec命令,以及exec命令执行的command,除非command忽略了SIGINT信号。
  • Ctrl+Z:暂停当前的命令,如果当前的命令是exec命令,那么就会暂停exec命令,以及exec命令执行的command,除非command忽略了SIGTSTP信号。可以用fg命令恢复暂停的命令,或者用bg命令让暂停的命令在后台继续运行。
  • Ctrl+D:结束输入,如果当前的命令是exec命令,那么就会结束exec命令的输入,以及exec命令执行的command的输入,除非command忽略了EOF信号。这相当于输入一个空行,或者按下回车键。
  • Ctrl+L:清屏,如果当前的命令是exec命令,那么就会清除exec命令的输出,以及exec命令执行的command的输出,除非command忽略了SIGWINCH信号。这相当于执行clear命令,或者reset命令。
  • Ctrl+R:搜索历史命令,如果当前的命令是exec命令,那么就会搜索exec命令之前执行过的命令,或者包含exec命令的命令,可以用方向键上下选择历史命令,或者继续输入关键字进行过滤,按下回车键执行选中的历史命令,或者按下Ctrl+G取消搜索。

Linux exec相关命令

0

评论区