shell脚本执行linux命令
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于shell脚本执行linux命令内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在shell脚本执行linux命令相关知识领域提供全面立体的资料补充。同时还包含 safari浏览器、samba、SAMP 的知识内容,欢迎查阅!
shell脚本执行linux命令相关知识
-
shell脚本暂停命令在Linux下,shell脚本暂停命令如下:1.linux shell暂停命令——suspend。 功能说明:暂停执行shell。 语法:suspend [-f] 补充说明:suspend为shell内建指令,可暂停目前正在执行的shell。若要恢复,则必须使用SIGCONT信息。 参数:-f 若目前执行的shell为登入的shell,则suspend预设无法暂停此shell。若要强迫暂停登入的shell,则必须使用-f参数。2.扩展资料:暂停进程的命令。 kill -STOP 1234 将该进程暂停。 如果要让它恢复到后台,用kill-CONT 1234(很多在前台运行的程序这样是不行的) 如果要恢复到前台,请在当时运行该进程的那个终端用jobs命令查询暂停的进程。 然后用fg[job号]把进程恢复到前台。
-
大技霸教你远程执行Linux脚本和命令如果现在需要在 Linux 服务器上执行一系列命令(比如搭建 LNMP 环境)我应该会第一时间想到想办法写个 Shell 脚本,然后扔上去执行以下看看结果。 然而一贯懒惰的我并不想这么去执行 Shell 和一些重复命令。所以俺寻思可以有个方法本地直接在服务器端执行脚本,寻思生异端,这时候有某大技霸告诉我有个叫 paramiko 的 Python 库,从此开启我新世界的大门。 对于 paramiko 安装直接 pip 或者 PyCharm 这里就不多说了,如果看到这里你觉得自己不怎么了解python语法的也不必担
-
如何在 Linux 启动时自动执行命令或脚本我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情。按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,有时,这个过程不到一分钟。当你注销或者关机时,也是这样。更有意思的是,在系统启动以及用户登录或注销时,还可以让系统执行特定的操作。本文,我们将探讨一下在 Linux 操作系统中实现这些目标的传统方法。注意:我们假定使用的是 Bash 作为登录及注销的主 Shell。如果你使用的是其他 Shell,那么有些方法可能会无效。如果有其他的疑问,请参考对应的 Shell 文档。在启动时执行 Linux 脚本有两种传统的方法可以实现在启动时执行命令或脚本:方法 #1 - 使用 cron 任务除了常用格式(分 / 时 / 日 / 月 / 周)外,cron 调度器还支持 @reboot 指令。这个指令后面的参数是脚本(启动时要执行的那个脚本)的绝对路径。然而,这种方法需要注意两点:a) cron 守护进程必须处于运行状态(通常情况下都会运行),同时b) 脚本或 cro
-
【学习】Linux Shell脚本编程1.脚本的组成和执行Linux shell脚本的结构并不复杂,其主要由变量、内部命令以及shell的语法结构和一些函数、其他命令行的程序等组成,以下是一个简单的shell脚本。#!/bin/bash #This is a first scriptechoecho Hello Bash Script!echo一般使用后缀名“.sh”来表示shell脚本,此脚本中的第一行使用“#!”开头,表明要用/bin/bash来解释和执行这个脚本文件,也可以使用/bin/sh来代替。实际上,/bin/sh是一个指向/bin/bash的软链接(soft link),也就是说,在执行/bin/sh 时,它调用的命令与/bin/bash 是相同的。可以使用如下的命令来查看/bin/bash文件。autotest@xa-stf-u1804:~/Documents$ ll -la /bin/bash-rwxr-xr-x 1&
shell脚本执行linux命令相关课程
shell脚本执行linux命令相关教程
- 1.3 Shell 脚本是什么 我们知道了 Shell 是一个用户与 Linux 系统内核的通讯的桥梁后,那么 Shell 脚本是什么呢?Shell 脚本就是操作 Shell 的指令集合编写成的一段实现目的需求的代码,也为一种管理 Linux 系统的脚本语言,我们可以简单地将其理解为,Linux 的各种指令加上一些流程控制和数据的集合,因为它还有不少的语法及格式,后面我们来通过学习,详细剖析其内在精髓。
- 2.3 source 执行 [root@xuel-transfer workspace]# bash 01-scripts.shthis is my first script[root@xuel-transfer workspace]# ./01-scripts.shthis is my first script[root@xuel-transfer workspace]# source 01-scripts.shthis is my first script[root@xuel-transfer /]# pwd/利用此种方式也可执行脚本,此方式在当前上下文中执行脚本,不会生成新的子进程。脚本执行完毕,回到当前 Shell,脚本内如果有 cd 命令脚本退出后会影响当前的环境上下文,此种方式运行 Shell,脚本也可以没有可执行权限。
- 2.3 shell 命令的执行过程 我们在上一节中介绍了 scrapy shell [url] 这样的指令,它帮助我们进入交互模式去执行调试获取网页的 xpath 表达式。我们有没有想过这个命令背后的原理?今天我们专门学习了 Scrapy Command,那么就正好借此机会看看 scrapy shell [url] 这条命令背后的原理是什么。根据前面跟踪代码的经验,我们可以直接定位到 scrapy/commands/shell.py 下 Command 类中的 run() 方法即可:# 源码位置: scrapy/commands/shell.py# ...class Command(ScrapyCommand): # ... def run(self, args, opts): url = args[0] if args else None if url: # first argument may be a local file url = guess_scheme(url) spider_loader = self.crawler_process.spider_loader spidercls = DefaultSpider if opts.spider: spidercls = spider_loader.load(opts.spider) elif url: # 如果传入了url参数,后面需要做请求 spidercls = spidercls_for_request(spider_loader, Request(url), spidercls, log_multiple=True) crawler = self.crawler_process._create_crawler(spidercls) crawler.engine = crawler._create_engine() crawler.engine.start() # 启动爬虫线程爬取url self._start_crawler_thread() shell = Shell(crawler, update_vars=self.update_vars, code=opts.code) shell.start(url=url, redirect=not opts.no_redirect) def _start_crawler_thread(self): t = Thread(target=self.crawler_process.start, kwargs={'stop_after_crawl': False}) t.daemon = True t.start()其实上面代码的执行逻辑是比较简单的,总的来说就做了2件事情:创建 scrapy 引擎并单独启动一个线程,后台运行;启动 shell 线程;我们来关注下 Shell 这个类:# 源码位置:scrapy/shell.py# ...class Shell: # ... def start(self, url=None, request=None, response=None, spider=None, redirect=True): # disable accidental Ctrl-C key press from shutting down the engine signal.signal(signal.SIGINT, signal.SIG_IGN) if url: self.fetch(url, spider, redirect=redirect) elif request: self.fetch(request, spider) elif response: request = response.request self.populate_vars(response, request, spider) else: self.populate_vars() if self.code: print(eval(self.code, globals(), self.vars)) else: """ Detect interactive shell setting in scrapy.cfg e.g.: ~/.config/scrapy.cfg or ~/.scrapy.cfg [settings] # shell can be one of ipython, bpython or python; # to be used as the interactive python console, if available. # (default is ipython, fallbacks in the order listed above) shell = python """ cfg = get_config() section, option = 'settings', 'shell' env = os.environ.get('SCRAPY_PYTHON_SHELL') shells = [] if env: shells += env.strip().lower().split(',') elif cfg.has_option(section, option): shells += [cfg.get(section, option).strip().lower()] else: # try all by default shells += DEFAULT_PYTHON_SHELLS.keys() # always add standard shell as fallback shells += ['python'] start_python_console(self.vars, shells=shells, banner=self.vars.pop('banner', ''))从上面的代码我们可以看到一点,当传入的参数有 url 或者 request 时,会调用 fetch() 方法去下载网页数据,它会调用 twisted 框架中的 threads 来执行网页的下载动作,并设置变量 response 。这就是为什么我们能在 scrapy shell 中直接使用 response 获取下载网页内容的原因。# 源码位置:scrapy/shell.py# ...class Shell: # ... def fetch(self, request_or_url, spider=None, redirect=True, **kwargs): from twisted.internet import reactor if isinstance(request_or_url, Request): request = request_or_url else: url = any_to_uri(request_or_url) request = Request(url, dont_filter=True, **kwargs) if redirect: request.meta['handle_httpstatus_list'] = SequenceExclude(range(300, 400)) else: request.meta['handle_httpstatus_all'] = True response = None try: response, spider = threads.blockingCallFromThread( reactor, self._schedule, request, spider) except IgnoreRequest: pass # 设置response结果 self.populate_vars(response, request, spider) def populate_vars(self, response=None, request=None, spider=None): import scrapy self.vars['scrapy'] = scrapy self.vars['crawler'] = self.crawler self.vars['item'] = self.item_class() self.vars['settings'] = self.crawler.settings self.vars['spider'] = spider self.vars['request'] = request self.vars['response'] = response if self.inthread: self.vars['fetch'] = self.fetch self.vars['view'] = open_in_browser self.vars['shelp'] = self.print_help self.update_vars(self.vars) if not self.code: self.vars['banner'] = self.get_help() # ...继续跟踪前面的 start() 方法,很明显我们的核心函数就是一句:start_python_console(self.vars, shells=shells, banner=self.vars.pop('banner', ''))self.vars 就是需要带到 shell 环境中的变量,shells 是我们选择交互的环境,后面可以看到总共支持4种交互环境,分别是 ptpython、ipython、ipython、和 python。banner 参数则表示进入交互模式是给出的提示语句。我们来看 start_python_console() 方法的源码:# 源码位置:scrapy/utils/console.py# ...DEFAULT_PYTHON_SHELLS = OrderedDict([ ('ptpython', _embed_ptpython_shell), ('ipython', _embed_ipython_shell), ('bpython', _embed_bpython_shell), ('python', _embed_standard_shell),])def get_shell_embed_func(shells=None, known_shells=None): """Return the first acceptable shell-embed function from a given list of shell names. """ if shells is None: # list, preference order of shells shells = DEFAULT_PYTHON_SHELLS.keys() if known_shells is None: # available embeddable shells known_shells = DEFAULT_PYTHON_SHELLS.copy() for shell in shells: if shell in known_shells: try: # function test: run all setup code (imports), # but dont fall into the shell return known_shells[shell]() except ImportError: continuedef start_python_console(namespace=None, banner='', shells=None): """Start Python console bound to the given namespace. Readline support and tab completion will be used on Unix, if available. """ if namespace is None: namespace = {} try: shell = get_shell_embed_func(shells) if shell is not None: shell(namespace=namespace, banner=banner) except SystemExit: # raised when using exit() in python code.interact pass通过分析代码可知:get_shell_embed_func() 方法最终会返回 DEFAULT_PYTHON_SHELLS 中对应值得那个,比如我们传入的 shells 值为 ['python'],则最后返回 _embed_standard_shell() 这个函数。最后就是调用这个函数,即可得到 scrapy shell 的交互模式。来最后看一看 _embed_standard_shell() 这个神奇的方法:# 源码位置:scrapy/utils/console.py# ...def _embed_standard_shell(namespace={}, banner=''): """Start a standard python shell""" import code try: # readline module is only available on unix systems import readline except ImportError: pass else: import rlcompleter # noqa: F401 readline.parse_and_bind("tab:complete") @wraps(_embed_standard_shell) def wrapper(namespace=namespace, banner=''): code.interact(banner=banner, local=namespace) return wrapper这段代码虽然简短,但它却是实现 scrapy shell 交互模式的核心方法。接下来,我们将基于上面这些方法来模拟构造一个简化的交互式模式来帮助我们更好的理解这些方法的作用。来看我抽取这些方法,简单编写的一个 test.py 脚本:[root@server2 shen]# cat test.py from functools import wrapsdef _embed_standard_shell(namespace={}, banner=''): """Start a standard python shell""" import code try: # readline module is only available on unix systems import readline except ImportError: pass else: import rlcompleter # noqa: F401 readline.parse_and_bind("tab:complete") @wraps(_embed_standard_shell) def wrapper(namespace=namespace, banner=''): code.interact(banner=banner, local=namespace) return wrapperdef start_python_console(namespace=None, banner='', shells=None): """Start Python console bound to the given namespace. Readline support and tab completion will be used on Unix, if available. """ if namespace is None: namespace = {} try: shell = _embed_standard_shell() shell(namespace=namespace, banner=banner) except SystemExit: # raised when using exit() in python code.interact passstart_python_console({'hello': 'world'}, banner='nothing to say')我们来运行下这个测试脚本看看效果:[root@server2 shen]# python3 test.py nothing to say>>> hello'world'>>> xxxTraceback (most recent call last): File "<console>", line 1, in <module>NameError: name 'xxx' is not defined>>> exit()是不是和 scrapy shell 交互式一模一样?到此为止,我们对 scrapy shell 这个命令已经分析的非常清楚了,大家是不是已经都理解了呢?
- 2.2 直接指定脚本文件名称 [root@shell workspace]# lltotal 4-rw-r--r-- 1 root root 44 Sep 3 14:16 01-scripts.sh[root@shell workspace]# . ./01-scripts.sh-bash: ./01-scripts.sh: Permission denied[root@shell workspace]# chmod +x 01-scripts.sh [root@shell workspace]# lltotal 4-rwxr-xr-x 1 root root 44 Sep 3 14:16 01-scripts.sh[root@shell workspace]# . ./01-scripts.sh this is my first script[root@shell workspace]# /workspace/01-scripts.sh this is my first script利用直接在终端指定脚本文件名称方式执行,此种方式需要为脚本添加可执行权限,在当前 Shell 来执行,不启动子 Shell,利用此种方式执行脚本的解释器为脚本内的第一行指定的解释器,例如此例中为#!/bin/bash,利用. 命令来执行脚本,一般用在当前目录没有在 PATH 中,所以第二个./ 是用来表示当前目录的。
- 3.2 编辑启动脚本 MacOS 默认的 shell 是bash,启动脚本是 ~/.bash_profile, 如果你的shell和我一样是zsh,那么启动脚本就是 ~/.zshrc, 以bash为例,使用vim编辑器编辑启动脚本:vim ~/.bash_profile输入字母i切换到输入模式,在启动脚本下添加如下两行命令:export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-15.0.1.jdk/Contents/Homeexport PATH=$JAVA_HOME/bin:$PATH第一行命令是设置一个名为 JAVA_HOME的环境变量,它指向 Java 的安装目录。第二行命令是将 JAVA_HOME 的bin目录附加到系统变量的 PATH上,这样,bin目录下的很多可执行文件就被系统加载了。最后保存并退出启动脚本,切换到底线命令模式(敲击esc按键 ,输入 :),输入wq,敲击回车按键。
- 1. Shell 脚本的构成及规范 Shell 脚本有一些约定俗成的规范,大家都遵循这些规则,编写出来的脚本更能被大家接受,Shell 脚本其实不能称为一门编程语言,它更像是一个工具,用来杂糅不同的程序及命令供我们调用来完成自己的预期操作。
shell脚本执行linux命令相关搜索
-
s line
safari浏览器
samba
SAMP
samplerate
sandbox
sanitize
saper
sas
sass
save
smarty模板
smil
smtp
snapshot
snd
snmptrap
soap
soapclient
soap协议