Questions tagged «shell-script»

有关shell脚本,由shell解释的可执行文件(bash,zsh等)的问题。

2
将数据管道传输到进程的标准输入而不会导致EOF之后
我有一个启动用户交互外壳的可执行文件。我想在启动Shell时首先注入一些命令,然后允许用户进行交互式会话。我可以使用以下命令轻松完成此操作echo: echo "command 1\ncommand 2\ncommand3" | ./shell_executable 这几乎可行。问题在于,在回显我的命令后,正在馈送进程的stdin的echo命令会击中EOF。此EOF导致外壳程序立即终止(就像您在外壳程序中按Ctrl + D一样)。 有没有一种方法可以将这些命令注入到stdin中,而不会在之后引起EOF?


4
如何在文件末尾删除换行符?
让我清除换行符: $ echo Hello > file1 ; cat file1 Hello $ echo -n Hello > file2 ; cat file2 Hello$ 在这里,您可以看到file1结尾处有换行符,而结尾file2没有。 现在假设我有一个file: $ cat file Hello Welcome to Unix $ 我想and Linux在文件末尾添加,然后echo " and Linux" >> file将其添加到换行符。但我要最后一行Unix and Linux 因此,为了变通,我想在文件末尾删除换行符。因此,如何删除文件末尾的换行符?

1
文件描述符和Shell脚本
我很难理解一个人如何在shell脚本中使用文件描述符。 我知道诸如 exec 5 > /tmp/foo 因此,将fd 5附加到foo进行编写。 exec 6 < /tmp/bar ...阅读。 exec 5>&- …关闭fd。 现在这是做什么的? #!/bin/bash exec 5 > /tmp/foo exec 6 < /tmp/bar cat <&6 | while read a do echo $a >&5 done 据我了解,&5关闭FD,那么每次调用后输出仍如何成功重定向? 这是来自的复制面食:这里 它声称通过简单的echo $a > file方法使用它会使其更快,但是我无法理解。我将不胜感激任何链接到体面的教程。我用google的功能似乎使我失望。


5
getopt,getopts还是手动解析-当我想同时支持长选项和长选项时使用什么?
目前,我正在编写具有以下要求的Bash脚本: 它应该可以在各种Unix / Linux平台上运行 它应该同时支持短和(GNU)长选项 我知道这getopts将是可移植性的首选方式,但是AFAIK不支持长选项。 getopt支持长选项,但BashGuide强烈建议不要这样做: 永远不要使用getopt(1)。getopt无法处理空参数字符串或带有嵌入式空格的参数。请忘记它曾经存在。 因此,仍然有手动解析的选项。这容易出错,会产生很多样板代码,我需要自己处理错误(我想自己getopt(s)进行错误处理)。 那么,在这种情况下首选的选择是什么?


2
kill,pkill和killall有什么区别
我熟悉kill命令,大多数时候我们只使用kill -9强制杀死一个进程,还有很多其他的信号可以使用kill。但是我不知道pkilland 的用例是什么killall,如果已经有kill命令。 这样做pkill并killall使用kill在执行命令?我的意思是说,它们只是包装器kill还是它们自己的实现? 我也想知道pgrep命令如何从进程名称中获取进程ID。 所有这些命令都使用相同的基础系统调用吗?从性能角度来看,哪个更快?

8
如何有效地在bash中生成大的,均匀分布的随机整数?
我一直想知道什么是在bash中获得良好随机性的最佳方法,即,什么程序可以获取MIN和之间的随机正整数,MAX从而 该范围可以任意大(或至少,例如,高达2 32 -1); 值是均匀分布的(即无偏差); 这是有效的。 获得bash随机性的有效方法是使用$RANDOM变量。但是,这仅采样0到2 15 -1 之间的值,该值可能不足以用于所有目的。人们通常会使用模数使其达到他们想要的范围,例如, MIN=0 MAX=12345 rnd=$(( $RANDOM % ($MAX + 1 - $MIN) + $MIN )) 另外,这会产生偏差,除非$MAX碰巧将2 15 -1 = 32767相除。例如,如果$MIN为0且$MAX为9,则值0到7比值8和9更有可能,因为$RANDOM永远不会是32768或32769。随着范围的增加,此偏差会变得更糟,例如,如果$MIN为0且$MAX为9999,然后通过2767数字0具有的概率4 / 32767,而数字2768到9999只的概率3 / 32767。 因此,尽管上述方法满足条件3,但不满足条件1和2。 到目前为止,我想满足条件1和2的最佳方法是使用/dev/urandom以下方法: MIN=0 MAX=1234567890 while rnd=$(cat /dev/urandom | tr -dc 0-9 | fold -w${#MAX} | head -1 | …

1
SSH导致while循环停止
我终于设法解决了我几个星期一直在努力的问题。我使用带有“授权密钥”的SSH来远程运行命令。一切都很好,除非我在while循环中这样做。使用ssh命令完成任何迭代后,循环终止。 很长时间以来,我认为这是某种ksh怪异的现象,但现在我发现bash的确具有相同的表现。 一个小示例程序来重现该问题。这是从一个较大的实现中提取的,该实现拍摄快照并在群集中的节点之间复制快照。 #!/bin/bash set -x IDTAG=".*zone" MARKER="mark-$(date +%Y.%m.%d.%H.%M.%S)" REMOTE_HOST=sol10-target ZFSPARENT=rpool ssh $REMOTE_HOST zfs list -t filesystem -rHo name,mounted $ZFSPARENT | grep "/$IDTAG " > /tmp/actionlist #for RMT_FILESYSTEM in $(cat /tmp/actionlist) cat /tmp/actionlist | while read RMT_FILESYSTEM ISMOUNTED do echo ${RMT_FILESYSTEM}@${MARKER} [ "$ISMOUNTED" = "yes" ] && ssh $REMOTE_HOST zfs …

4
是否有JavaScript Shell?
最近,我一直在与JS合作,并对这种语言非常热情。我知道有在服务器端运行JS的node.js,但是是否有使用JS作为脚本语言的shell?如果存在这种情况,它的可用性和稳定性如何?


3
如果我sudo执行一个Bash脚本文件,那么Bash脚本中的所有命令是否也将作为sudo执行?
我想在Bash中编写一个自动化的安装后脚本(post-install.sh例如,称为)。该脚本将自动添加和更新存储库,安装和更新软件包,编辑配置文件等。 现在,如果执行该脚本(例如使用)sudo post-install.sh,是否仅会提示我输入一次sudo密码,或者sudo每次在脚本中需要sudo权限的命令调用时都需要输入密码?换句话说,可以这么说,bash脚本中的命令是否“继承”了执行权限? 并且,如果确实如此,那么sudo权限是否仍有可能超时(例如,如果特定命令花费的时间足够长以超过sudo超时时间)?还是初始sudo密码输入会持续整个脚本的整个过程?

4
为什么set -e在带括号()后跟OR列表||的子外壳中不起作用?
我最近遇到了一些这样的脚本: ( set -e ; do-stuff; do-more-stuff; ) || echo failed 在我看来,这很好,但是不起作用!将set -e不适用,当你添加的||。没有它,它就可以正常工作: $ ( set -e; false; echo passed; ); echo $? 1 但是,如果添加||,则将set -e被忽略: $ ( set -e; false; echo passed; ) || echo failed passed 使用真实的独立外壳可以按预期工作: $ sh -c 'set -e; false; echo passed;' || echo failed …

6
从子外壳退出外壳脚本
请考虑以下代码段: stop () { echo "${1}" 1>&2 exit 1 } func () { if false; then echo "foo" else stop "something went wrong" fi } 通常,当func被调用时,它将导致脚本终止,这是预期的行为。但是,如果它是在子外壳中执行的,例如 result=`func` 它不会退出脚本。这意味着调用代码必须每次检查函数的退出状态。有办法避免这种情况吗?这set -e是为了什么?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.