在将命令输出转到文件或者另外一个命令的时候,你可能会注意到错误提示打印在屏幕上。 在 Bash 和其他 Linux shells 中,当程序执行时,它使用三个标准的 I/O 流。...例如,下面两个命令是一样的,都将命令输出转向到文件。...转向stdout 当保存程序输出到文件时,通常将标准错误stderr转向stdout,以便在同一个文件中记录完成信息。...file,而2>&1将标准错误stderr转向到当前的标准输出stdout。...在 Bash 中 &>和2>&1 一个意思: command &> file 四、总结 在使用命令行的时候,理解转向和文件描述符的概念是非常重要的。
问: 如何从Bash脚本本身中获得其所在的目录? 我想使用Bash脚本作为另一个应用程序的启动器。我想把工作目录改为Bash脚本所在的目录,以便我可以对该目录下的文件进行操作,像这样: $ ....但是在以相对路径的方式去执行脚本时,获取的目录信息是相对路径,不能满足其他需要获取绝对路径的场景。 如果要获取绝对路径,可以使用如下方法: #!...测试结果如下: 另外,可以根据第一种方法结合使用 realpath 命令,也可获取脚本所在目录的绝对路径: #!...为什么我不能在脚本中使用"cd"来更改目录 为什么在可执行文件或脚本名称之前需要..../(点-斜杠),以便在bash中运行它 shell脚本对编码和行尾符敏感吗
问: 如何验证程序是否存在,以一种要么返回错误并退出,要么继续执行脚本的方式? 这看起来应该很容易,但它一直困扰着我。...它是一个外部进程,相对而言 hash、type 或 command 这样的内置程序执行效率更高,你还可以依靠内置程序来实际执行所需的操作,而且外部命令的效果很容易因系统而异。...许多操作系统会让 which 做一些自定义和邪恶的事情,比如更改输出,甚至 hook 到包管理器。...---- 参考: stackoverflow question 592620 man bash 相关阅读: 为什么在可执行文件或脚本名称之前需要..../(点-斜杠),以便在bash中运行它 在shell编程中$(cmd) 和 `cmd` 之间有什么区别
以调试模式运行脚本 通过bash -x 的方式可以在调试模式下运行整个脚本, bash会在在运行前打印出了每一行命令, 而且每行前面用+号表明命令的嵌套层数. > bash -x debug.sh...关键字用于在解释出现错误时执行预设的操作, 例如打印出错的命令: trap 'echo $BASH_COMMAND' ERR 但鉴于使用trap进行调试的执行效率过低, 建议在较为复杂的脚本中直接使用调试选项或者使用...通过使用-f选项可以显著减少脚本中的转义字符: > ls ?...: var: unbound variable 为防止误操作覆盖文件中的数据, 设置禁止重定向到已经存在的文件: > set -C # 等价于 set -o noclobber > touch test...* > ll * -rw-rw-r-- 1 remilia remilia 0 Mar 1 20:09 '*' 到此这篇关于详解bash中的脚本调试机制的文章就介绍到这了,更多相关bash 脚本调试
/bin/bash POSITIONAL_ARGS=() #初始化一个空数组,用来存储位置参数 while [[ $# -gt 0 ]]; do #当命令行参数的数量大于0时,进入循环 case...$1 in -e|--extension) #如果参数是这个,脚本会将紧随其后的参数(文件扩展名)保存在变量 EXTENSION 中 EXTENSION="$2" shift...# 跳过参数 shift # 跳过后面的值 ;; -s|--searchpath) #如果参数是这个,脚本会将紧随其后的参数(搜索路径)保存在变量 SEARCHPATH...中 SEARCHPATH="$2" shift # 跳过参数 shift # 跳过后面的值 ;; --default) #如果参数是这个,脚本会将变量.../bin/bash for i in "$@"; do #循环遍历所有的命令行参数 case $i in -e=*|--extension=*) EXTENSION="${i
cidr-to-ip.sh [OPTION(only one)] [STRING/FILENAME] -h 显示此帮助屏幕 -f 在给定 STRING(s) 时强制检查网络边界 -i 将从输入文件中读取.../bin/bash ############################ ## Methods ############################ prefix_to_bit_netmask
shell脚本中 '$' 与不同的符号搭配其表示的意义也会不同 特殊标志符 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。...例如,第一个参数是$1,第二个参数是$2 $# 传递给脚本或函数的参数个数 $* 传递给脚本或函数的所有参数 $@ 传递给脚本或函数的所有参数 $?...上个命令的退出状态 $$ 当前Shell进程ID $() 与 `(反引号) 一样用来命令替换使用 ${} 引用变量划分出边界 注释:$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" "...)包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。.../bin/bash echo "file name $0" echo "first param $1" echo "pid $$" echo "total num of param $#" echo
在python脚本中执行shell命令的方法 最近在写python的一些脚本,之前使用python都是在django中使用,可能大部分内容都是偏向于后端开发方面的,最近在写一些脚本的时候,发现了...使用Python处理一个shell命令或者一个执行一个shell脚本,一般情况下,有下面三种方法,下面我们来看: 第一种方法是使用os.system的方法 os.system("cmd") 我们在当前目录下面创建一个...aaa.sql中的内容,然后下面出现的数字0代表上述命令执行成功;如果我们打印bbb.sql则返回值是256,表示执行中出现了问题。...,可以得到一个脚本或者一个命令的返回值和执行结果,当然,我们也可以使用下面的方法来分别校验aaa.sql文件是否存在,以及查看aaa.sql的执行结果: 1[root@ /data]$python 2Python...] 7else: 8 result["result"] = false 9 result["message"] = res 10return Response(result) 如果脚本中是对数据库的一系列操作
问题 我想将一个命令保存到一个变量中,以便稍后再使用(不是命令的输出,而是命令本身)。...我有一个简单的脚本如下: command="ls"; echo "Command: $command"; #Output is: Command: ls b=`$command`; echo $b;...(带有管道/多个命令)的命令存储在变量中以供以后使用?...回答 对于带有管道或重定向的组合命令最推荐的方式是将其封装到一个函数里,然后在需要时直接调用即可。...使用 eval 命令时需要非常小心,因为它可以使得代码可读性较差并且容易引入安全漏洞。朋友们有踩到过 eval 命令的坑吗,可以在评论区留言交流一下。
方法一、使用输入重定向 逐行读取文件的最简单方法是在while循环中使用输入重定向。...变量为文本文件中的每行内容 Tips:可以将上面的脚本缩减为一行命令,如下: [root@localhost ~]# while read rows; do echo "Line contents are...- 使用echo显示输出内容,输出内容包括自定义的字符串和变量,$rows变量为文本文件中的每行内容 Tips:可以将上面的脚本缩减为一行命令,如下: [root@localhost ~]# cat mycontent.txt...|while read rows;do echo "Line contents are : $rows";done 方法三、使用传入的文件名作为参数 第三种方法将通过添加$1参数,执行脚本时,在脚本后面追加文本文件名称...,并在变量“rows”中保存每一行的内容 - 使用echo显示输出内容,$rows变量为文本文件中的每行内容 - 使用输入重定向<从命令行参数$1读取文件内容 方法四、使用awk命令 通过使用awk命令
理论知识 在编写脚本的时候会频繁使用标准输入(stdin)、标准输出(stdout)和标准错误(stderr)。 通过内容过滤将输出重定向到文件是我们平日里的基本任务之一。...也就是说在把echo命令的输出写入文件之前, temp.txt中的内容首先会被清空。...和stdout重定向到同一个文件中 还可以利用下面这个更好的方法将stderr转换成stdout,使得stderr和stdout 都被重定向到同一个文件中 $ cmd >output.txt 2...: pwd2: command not found ---- 将stderr的输出重定向到 /dev/null 有时候,在输出中可能包含一些不必要的信息(比如调试信息)。...如果你不想让终端中充斥着有关stderr的繁枝末节,那么你可以将stderr的输出重定向到 /dev/null cmd 2>/dev/null ---- 既可以将数据重定向到文件,还可以提供一份重定向数据的副本作为后续命令的
问: 假设我有这个脚本: export.bash #!.../usr/bin/env bash export VAR="HELLO, VAR" 当我执行脚本并尝试访问 $VAR 时,我没有得到任何值!...在调用 shell 的上下文中执行脚本: $ cat set-vars1.sh export FOO=BAR $ . set-vars1.sh $ echo $FOO BAR 另一种方法是在脚本中打印设置环境变量的命令.../set-vars2.sh)" $ echo "$FOO" BAR 在终端上执行 help export 可以查看 Bash 内置命令 export 的帮助文档: # help export export...help eval 相关阅读: 用和不用export定义变量的区别 在shell编程中$(cmd) 和 `cmd` 之间有什么区别 ----
摘录原文: paramiko远程执行后台脚本“阻塞”问题 我写的远程命令通道上线之后,发现在远程脚本中后台再执行另一个脚本,通道会一直等待后台脚本执行完成才会返回,有时甚至会僵死。...②、发起远程执行 在本地执行 python test.py,会发现整个脚本不会立即打印run ok,而是等30s之后才打印包括test.sh的所有输出信息。...2、解决办法 将远程脚本的标准输出stdout重定向到错误输出stderr即可,test.py 修改如下: import paramiko client = paramiko.SSHClient() client...其实原因很简单,因为bash /tmp/test.sh & 虽然是后台执行,但是依然会产生标准输出,一旦产生标准输出,paramiko就会认为命令还未执行完成,且stdout的buffer大于stderr...这里只要将脚本执行的标准输出重定向到错误输出(1 &2),然后paramiko就可以使用stderr快速读取远程打屏信息了。
所以我期望 ${len} 的结果为 '2'。然而,它打印的是 '1'。原因是它将 find 命令的所有结果视为一个元素。我该如何修复这个问题?...答: 如果你有最新的bash版本(4.4-alpha或更高),建议使用 bash 内置的 readarray 命令。 readarray -d '' array < <(find ....从标准输入读取行到索引数组变量中。 选项说明: -d delim 使用 而非换行符标志一行的结束 -n count 最多复制 行。...最后一行结合了重定向和命令替换,将 find 的输出提供给 while 循环的标准输入。...如何将Bash数组的元素连接为分隔符分隔的字符串 如何在Bash中连接字符串变量 更多好文请关注↓
命令的输出不仅可以是显示器,还可以很容易的转移向到文件,这被称为输出重定向。...标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。...和 stderr 合并后重定向到 file command file2 # stdin 和 stdout 都重定向 全部可用的重定向命令列表: 命令 说明 command > file...EOF /dev/null 文件 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null: command > /dev/null /dev/null 是一个特殊的文件...但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到禁止输出的效果。
那么在Linux标准流中,stdout和stderr也同样如此。如果我们使用了Linux标准流的功能,当我们执行一个命令成功后,那么终端打印的信息也将会被传送至stdout中。...当我们执行命令失败后,那么终端打印的报错信息也将会被传送至stderr中。 1.1、stdout 输出重定向我们一般使用 >来表示,比如将信息输出重定向到一个文件中。...1.2、stderr 错误重定向我们一般使用 2> 来表示,比如将错误信息重定向到一个文件中。...1.4、追加信息输出重定向 我们上面的stdout和stderr只是将信息输出到一个文件中,如果再次重定向输出的话,文件之前的内容将会被覆盖掉,只会写入最新的内容到文件中,比如: bash [root@...: 'cat' bash: catt: 未找到命令… ## 这是新的错误信息 相似命令是: 'cat' 1.5、同时进行标准输出和错误输出至文件 在企业中往往是这么干的,写一个脚本,包含很多命令,那么我们需要将打印服务信息的命令写上
shell脚本介绍 ? shell脚本结构和执行 ? ? ? ? 开头需要加#!/bin/bash 因为有了#!...脚本的名字以.sh结尾,用于区分这是一个shell脚本 执行方法有两种 chmod +x 1.sh; ./1.sh bash 1.sh 查看脚本执行过程 bash -x 1.sh ?...查看脚本是否语法错误 bash -n 1.sh ? date命令用法 ? date命令是显示系统的当前的日期和时间,date在shll当中作用很大 ?...时间的标记 ? 组合一起等同于大T ? date +%w周几+大W是今年的第几周 ? 表示日历的命令cal ? date -d “-1 day” 一天前 ?...shell脚本中的变量 ?
15.1 理解输入和输出 现在知道两种显示脚本输出的方法 1)在显示器屏幕上显示 2)将输出文件重定向到文件中 15.1.1 标准文件描述符 Linux系统将每个对象当做文件处理。...>> 表示追加到文件 注意:用了输出重定向,shell并未将错误消息重定向到输出重定向文件中。错误消息仍会显示在显示器中。 3.STDERR 标准错误(2) STDERR文件描述符来处理错误消息。...15.2 在脚本中重定向输出 有两种方法: 1)临时重定向行输出 2)永久重定向脚本中的所有命令 15.2.1 临时重定向 可以单独将一行重定向到STDERR。...15.3 在脚本中重定向输入 exec 命令允许你将STDIN重定向到Linux系统上的文件中。 例子:查看test2中的数据 1 #!...>> 将cat命令的输出追加到由$outfile变量指定的文件中。 cat命令的输入不在取自标准输入,而是被重定向到脚本中存储的数据。 EOF符号标记了追加到文件中的数据的起止。
变量替换 在平常的开发中,脚本会依赖很多的配置,例如监听端口、配置文件之类的可变参数,如果我们将其硬编码到脚本中,那么改起来就是牵一发动全身了,很麻烦,不可靠。.../bin/bash # set命令的奇妙用途留在文章末尾 set -eu # nginx配置文件在不同环境中,位置可能不同,所以需要将其抽离成可配置变量,脚本来引用 NGINX_CONFIG_FILE=.../bin/bash # set命令的奇妙用途留在文章末尾 set -eu # nginx配置文件在不同环境中,位置可能不同,所以需要将其抽离成可配置变量,脚本来引用 NGINX_CONFIG_FILE=...,需要两条命令,在一定条件下,一起执行,类似于事务的概念,这就要通过()来实现,括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。...重定向至stdout 脚本开发过程中,在我们使用管道时,默认只是传递stdout,在某种场景下,比如需要根据stderr的内容进行判断,默认情况下就不支持,需要我们进行特殊处理,stderr重定向至stdout
在Unix-like系统中,I/O流的重定向是常见的操作,它可以改变命令输出的去向。...在Shell中,有三种主要的I/O流: stdout(标准输出)- 文件描述符为1 stderr(标准错误)- 文件描述符为2 stdin(标准输入)- 文件描述符为0 如图展示了两个 nc 命令的运行情况...分析第一个命令: bash nc -zv 10.0.0.1 443 2>&1 >> /dev/null 这个命令中的 2>&1 表示将标准错误重定向到当前标准输出的位置,但是这个操作是在 >> /dev...结论 重定向操作的顺序对结果有决定性的影响。当我们想要丢弃所有输出时,正确的方法是先重定向 stdout 到 /dev/null,然后再将 stderr 重定向到 stdout。...在设计脚本时,应该考虑到这些输出的处理情况,从而确保脚本在各种不同的环境和条件下都能稳定运行。 在系统管理和自动化任务中,经常需要确保输出不会干扰脚本的执行或是污染日志文件。
领取专属 10元无门槛券
手把手带您无忧上云