shell中的$?与exit 0和1代表啥意思?起啥作用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell中的$?与exit 0和1代表啥意思?起啥作用?相关的知识,希望对你有一定的参考价值。
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "the script name is:$0"
[ -n "$1" ] && echo "the 1st paramter is: $1" ||exit 0
[ -n "$2" ] && echo "the 2nd paramter is: $2" ||exit 0
[ -n "$3" ] && echo "the 3th paramter is: $3" ||exit 0
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "the script name is:$0"
[ -n "$1" ] && echo "the 1st paramter is: $1" ||exit 1
[ -n "$2" ] && echo "the 2nd paramter is: $2" ||exit 1
[ -n "$3" ] && echo "the 3th paramter is: $3" ||exit 1
$?与他们看不出有什么关系呀。
[ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK,continue" && exit 0
[ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK,continue" && exit 1
exit0和1加在这里有什么作用?和意义。
比如说脚本名字是run.sh,运行时的命令行是 ./run.sh arg1 arg2
这时$0就是脚本本身,也就是./run.sh,$1就是arg1,$2就是arg2...
至于exit 0首先是退出脚本,其次是指定脚本退出时的返回值,退出后,可以用$?得到这个值。
比如,脚本里退出时是执行的exit 1,这次脚本停止执行并退出,退出后,在shell里echo $?,会得到1这个值。一般来说,0代表成功,其它值代表失败,具体什么值代表什么错误就看写脚本时的约定了。
注意一点,$?一定是最近一次命令的结果,如果你执行脚本时exit 1,但是脚本退出后先执行了一个ls命令,这时ls命令的执行是成功的,那这时再echo $?,得到的就是ls的返回值 0,而不是脚本的exit 1了。
总结一下:$n是用来得到命令行参数,exit n是用来结束脚本并将执行结果返回给调用方,一般就是shell或另外的脚本,而$?是用来得到最近一次命令的返回值。 参考技术A $?命令状态
当命令成功完成, 返回0
发生错误并退回, 返回非0
网友解释:
当 exit 1 的时候,一般是出错定义这个1,也可以是其他数字,很多系统程序这个错误编号是有约定的含义的。 但不为0 就表示程序运行出错。 调用环境就可以根据这个返回值判断 你这个程序运行是否ok
你可以看看CU的帖子 参考技术B $? 指代的是上一条指令的执行结果
exit 0 和 1 是shell 执行结果的返回值
如果你执行这个shell,然后在终端里打echo $?
此时的值应该就是exit后面跟的值 参考技术C 没什么区别, 前面一个是说退出差返回0 后一个是返回1 , 如果不理解可以一步一步的执行,在执行完上一条代码后,echo $? 可以看到返回结果
运行命令但留在 shell vs exit
【中文标题】运行命令但留在 shell vs exit【英文标题】:Run a command but stay in the shell vs exit 【发布时间】:2019-02-01 22:06:24 【问题描述】:我知道在 vim 中我可以输入
:terminal <command> %
对当前编辑缓冲区中的文件运行命令。例如,为了简化我想做的事情,让我们使用一个简单的 ls 命令:
:terminal ls %
这将拆分窗口,运行命令并退出 shell,同时将输出留在屏幕上。这不是我想要的。我希望它运行命令,但将我留在 shell 中,这样我就可以运行更多可能与当前文件/操作相关的 bash 命令,然后在我完成后手动退出。
如果我只是输入
:terminal
它把我带到了一个 bash shell,它允许我输入任意数量的命令,这很棒。但是我失去了使用 % 扩展工具的能力,以及从我正在编辑的文件中生成终端的便利性。 IE。我失去了从原始文件/缓冲区产生的上下文的自动化,这意味着我必须手动输入当前文件名,包括可能的长路径,或者滚动以前的 bash 历史记录以重新运行原始命令.这是对击键的浪费。
基本上,我正在尝试找到一种方法来创建一个 vim 映射,该映射允许我通过 :term
在 bash 命令中使用 % 文件名扩展,而不在命令运行后结束作业(我更喜欢留在在 shell 中提示继续会话!)
我实际上不在乎解决方案是否只是启动 :term
shell 并在 bash 提示符下使用 % 文件名扩展来回显我的命令而不输入它。这将允许我在执行命令后仍留在 bash由我手动回车。
我不确定我想做的事情是否可行?请注意,我不打算暂停当前的编辑会话并返回 fg,因为它会占用当前的编辑会话。我不确定 tmux - vim 集成是否可以提供一种方法来做我想做的事,尽管我更喜欢直接使用:term
找到解决方案,因为它是一个内置功能,除了我的功能外,它运行良好我正在努力实现:)
【问题讨论】:
I don't think this is possible with:term
, although might be possible manually starting the terminal with term_start()
and a handler for a proper option (see help for job-options
).不过,我必须说,整个情况并不是特别简单。您希望在不打开终端的情况下从不断打开的终端(历史记录、滚动查看以前的命令)中获取功能。我不明白每次运行命令后保持一个新的打开会更实用。
感谢您的回复。基本上我希望终端在 vim 拆分中,以便我可以保留上下文。可以说,我不想使用 % 在我当前编辑的文件上运行 ls,而是想实际运行 %,因为它是一个 python 脚本文件。在从 vim :term
第一次运行脚本(没有 args 的香草运行)后,有时我喜欢重新运行脚本,但然后从命令行输入 不同 args。有时这些 args 是文件,我可以使用 bash 选项卡完成将它们添加到脚本命令行,或者我可以运行 find 或其他 bash 命令来查找要指定为 args 的文件。
cont'd.. 如果该术语在运行我的 % 脚本文件后退出,那么我将无法使用不同的参数等从命令行继续使用它。保留文件很好编辑上下文打开 b/c 最终我将回到文件并编辑/更改它。当然,我可以直接打开:term
,我有一个完整的外壳,可以得到我想要的 90%。但是如果 vim 不在我编辑的文件的目录中,我必须找到我当前正在编辑的文件。没有上下文。如果可以将 % 传递给 shell 并且 shell 不会退出它,那就更容易了。有意义吗?
【参考方案1】:
正如人们所评论的那样,实际上并没有直接执行此操作的方法,但您可以使用帮助脚本来获得您想要的大部分内容。
使用 bash 作为 shell(为什么不),编写如下脚本:
#!/bin/bash
# could add echo $1 or ls $1 or whatever you want here.
V="$1" exec bash
称它为vim-bash
,使其可执行并将其放在您的路径中的某个位置。然后在 vim 中,:terminal vim-bash %
会给你一个 shell,当前文件名为 $V
。
您可以通过创建一个 vim 命令来包装它来扩展这个想法:
command! Vterminal :execute 'terminal vim-bash %'
然后你只需要从 vim 运行:Vterminal
。您将获得一个外壳,您可以在其中轻松访问文件名:
$ echo $V
my/really/long/pathname
您可以看到您可以将 ls
命令直接添加到脚本中,但如果您想冒险,您可以调整 vim 命令以通过一行来执行。
【讨论】:
【参考方案2】:您可以通过映射来做到这一点。 此映射适用于扩展“%”并使新终端保持活动状态:
:nmap <F12> :let $MYFILE=expand('%')<CR>:terminal<CR>echo $MYFILE<CR>
您可能需要映射到不同的键,否则这应该可以工作。
【讨论】:
【参考方案3】:您可以使用命令'put'将变量放在光标之后。例如:
let filename=expand(%)
term
put='ls '.filename
【讨论】:
这不起作用 -- vim 报告“无法进行更改,'modifiable' 已关闭”。【参考方案4】:试试这个:
:terminal ls % && bash
【讨论】:
以上是关于shell中的$?与exit 0和1代表啥意思?起啥作用?的主要内容,如果未能解决你的问题,请参考以下文章