shell脚本的执行方式
首先脚本需要有执行权限
chmod u+x file.sh
执行脚本有三种方法:
1. ./file.sh
特点:开启bash子进程来执行,也就是开启额外的进程来进行,不影响原进程的变量、配置等
2. bash file.sh
特点:和./file.sh相同
3. source file.sh 或者 . file.sh
特点:在原bash进程中执行脚本。
第三种方法主要用于在脚本中切换用户su、切换目录cd等命令。
source 和 . 命令是相同的。
你可以搜索 source
补充,如何查看脚本运行是否开启了bash子进程
1.
vim
file.sh
2.
写入
#!/bin/bash
#echo
$$命令会输出bash进程id
echo
$$
3.
保存并赋予可执行权限chmod
u+x
file.sh
4.
在你的shell中输入,echo
$$
屏幕输出4176
5.
./file.sh
屏幕输出3600
6.
bash
file.sh
屏幕输出3984
7.
source
file.sh
屏幕输出4176
和
你直接在shell中输出的一样,说明是在同一个bash进程
2. 本地shell脚本中ssh到远程服务器并执行命令
在实际运用中在当前服务器执行命令后,需要在另一台服务器继续执行某些命令,和耐衫分开去到另一台服务器执行也是比较麻烦的,因此整理下集中执行的方式唤腔
1、首先配置ssh免密操作
Linux 下实现SSH互信: https://www.jianshu.com/p/2456d98aa607
2、简单命令
ssh [email protected] "cd /var/lib; ls; cd "
2.1 使用时注意,双引号必须有。若没加双引号,第二条及之后的命令会在本地执行
2.2 分号是将两条语句间隔开
2.3 单双引的区别:单引号不会解析值,是什么就传什么;双引号会解析值,将解析结果传过去
3、多条命令
ssh [email protected]<< reallssh
cd /var/lib/test
tar -zxvf api.com.tar.gz
......
exit
reallssh
3.1 命令写在 << reallssh(开始亩闷) 至 reallssh(结束) 之间
3.2 reallssh可自己定义为其他形式
3.3 在结束前加上exit退出远程
4、可能遇到的问题
问题:远程登录主机时出现Pseudo-terminal will not be allocated because stdin is not a terminal. 错误
解决方案:字面意思是伪终端将无法分配,因为标准输入不是终端。
所以需要增加-t -t参数来强制伪终端分配,即使标准输入不是终端。
to force pseudo-tty allocation even if stdin isn’t a terminal.
参考样例如下:
ssh -t -t [email protected] -p 22
--------------------------------------------------------------------------------
参考:https://blog.csdn.net/jinking01/article/details/84386769
3. Linux Shell脚本的执行过程
用户登录时,将会取得一个 bash ,这个 bash 在系统中有一个全局唯一的ID,也就是进程的ID,使用命令 ps -ef 并配合 grep 来查看进程ID。 ps -ef|grep bash ,此命令还能查看进程对应的父进程ID,系统中所有进程的祖先进程都是INIT进程(进程ID=1),它是最先启动运行的。
回到 bash 进程,也就是我们的命令行界面,进程的执行都有其附属的执行环境,环境变量就属于其中之一。并且环境变量是可以完全被子进程继承的,也就是说,子进程可以使用父进程的环境变量,但是不能使用父进程的自定义变量。
简而言之: 子进程继承父进程的环境变量,不继承父进程的自定义变量。
shell脚本有4种执行方式,不同的执行方式可能导致结果不一致
四种方式的执行结果如下:
4. shell脚本的执行都有哪些方法,有何不同
你好!
运行一个Bash脚本的3中方式:
1.为脚本文件加上可执行的权限:
chmod
+x
script_file
2.运行/bin/bash
命令并且把脚本文件名作为它的参数
3.可在shell脚本中的开头加上一句:#!/bin/bash,然后在脚本所在目录
./shellfile
看自己的需求,没什么本质的区别。
希望对你有所帮助,望采纳。
5. shell脚本程序的执行有哪三种格式
题主你好,
1.点命令.//./script.sh
2.source命令.//sourcescript.sh
3.直接调用脚本解释器.//bashscript.sh
测试代码及截图如下:
希望可以帮到题主,欢迎追问
6. 执行shell脚本的方式主要是什么
(1)输入定向到Shell脚本
$ bash < 脚本名
(2)以脚本名作为参数
$ bash 脚本名 〔参数〕
(3)将Shell脚本的权限设置为可执行,然后在提示符下直接执行它。
$ chmod a+x 脚本名
$ PATH=&PATH:.
$ 脚本名
7. Shell脚本的几种执行方式之区别
1、bash 脚本文件或者 sh 脚本文件,通过这种方式可以运行没有执行权限或者在脚本里面没有指定解释器的脚本;
2、./脚本文件或者脚本文件全路径,通过这种方式执行脚本文件需要脚本文件有执行权限,并且在脚本文件里面指定了正确的解释器;
3、source 脚本文件或者. 脚本文件(.和脚本文件之间有空格),这种运行方式是在当前shell下运行,运行后脚本中定义的变量不会释放,这也是此种方式运行脚本与前三种的最大区别。例如在脚本中定义了name=GG,那么在脚本运行完成之后,echo $name仍会显示GG
8. 执行shell脚本三种方法的区别:(sh、exec、source)
使用$ sh script.sh执行脚本时,当前shell是父进程,生成一个子shell进程,在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。
./script.sh与 sh script.sh等效。
使用$ source script.sh方式,在当前上下文中执行脚本,不会生成新的进程。脚本执行完毕,回到当前shell。
source方式也叫点命令。
. script.sh与 source script.sh等效。
使用exec command方式,会用command进程替换当前shell进程,并且保持PID不变。执行完毕,直接退出,不回到之前的shell环境。
二、测试验证
vi loop.sh
显示当前进程
sh的方式:执行loop.sh打印执行进程
source方式:执行loop.sh打印执行进程
exec方式:执行loop.sh打印执行进程
按下ctrl+C
sh方式:父进程是6770,执行loop.sh时的子进程是13736。执行完毕后回到父进程shell。
source方式:父进程和子进程都是6770(执行时没有新的进程),执行完毕会回到父进程shell。
exec方式:进程PID没有改变都是6770,执行完毕(ctrl+C强制关闭)时直接退出了shell。脚本执行时替换了父进程的shell,执行完毕后直接退出,没有回到之前的shell。
9. linux问题:写出执行shell脚本的三种方式,写出samba服务器的四种安全级别,并写出他们的
保持乐观的心态,拥有容忍的态度,该赚钱就赚钱,该玩就玩,该学习就学习,该低调就低调,多锻炼锻炼,慢慢会好的。保持乐观的心态,拥有容忍的态度,该赚钱就赚钱,该玩就玩,该学习就学习,该低调就低调,多锻炼锻炼,慢慢会好的。保持乐观的心态,拥有容忍的态度,该赚钱就赚钱,该玩就玩,该学习就学习,该低调就低调,多锻炼锻炼,慢慢会变的更优秀。
10. 如何运行shell脚本
编写好的shell脚本(如:test),可以采取两种方式进行运行:
一、 $ sh test
一般不采用这种调用方式,尤其不采用“sh<test”的调用方式,因为这种方式将禁止shell读取标准输入。
也可以采用 $ ksh test
这种方式要求shell具有“可读”的访问权限。
二、直接运行可执行的shell脚本之前,首先应使用下列chmod命令,把shell脚本文件设置为可执行的文件。
chmod 755 test(除文件属主可写之外,每个用户均具有读和可执行的访问权限)
chmod +rx test(同上)
chmod u+rx test(只有文件属主具有读和执行的访问权限)
按照上述要求设置shell脚本文件的访问权限后,可采用下列方式,直接运行shell脚本了。
1、test(如果命令检索路径包含当前目录)
2、./test(如果命令减缩路径不包含当前目录)
*说明: sh test 方式调用一个shell叫蹦可能会禁止某些shell特定的扩展功能,因而可能引起脚本无法正确执行。