Questions tagged «shell-script»

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

5
有状态的bash功能
我想在Bash中实现一个函数,该函数在每次调用时都会增加(并返回)计数。不幸的是,这似乎很简单,因为我正在子外壳中调用该函数,因此它无法修改其父外壳的变量。 这是我的尝试: PS_COUNT=0 ps_count_inc() { let PS_COUNT=PS_COUNT+1 echo $PS_COUNT } ps_count_reset() { let PS_COUNT=0 } 这将按如下方式使用(因此需要从子shell调用函数): PS1='$(ps_count_reset)> ' PS2='$(ps_count_inc) ' 这样,我将获得一个编号的多行提示: > echo 'this 1 is 2 a 3 test' 可爱。但由于上述限制,因此无法使用。 不可行的解决方案是将计数写入文件而不是变量。但是,这会在多个同时运行的会话之间产生冲突。当然,我可以将Shell的进程ID附加到文件名中。但是我希望有一个更好的解决方案,它不会使我的系统中包含很多文件。

4
Bash:交互式远程提示
我有一个脚本可以连接到远程服务器,并检查是否安装了某些软件包: ssh root@server 'bash -s' < myscript.sh myscript.sh: OUT=`rpm -qa | grep ntpdate` if [ "$OUT" != "" ] ; then echo "ntpdate already installed" else yum install $1 fi 这个例子可以简化。这是myscript2.sh同样的问题: read -p "Package is not installed. Do you want to install it (y/n)?" choise 我的问题是bash无法以交互方式读取我的答案。 有没有一种方法可以远程执行本地脚本而不丢失提示用户的能力?
16 bash  shell-script  ssh  stdin  read 

3
终止后台运行的bash shell脚本
我经常使用bashShell脚本为许多不同的文件运行简单的命令。例如,假设我有以下bash的shell脚本,叫script.sh,运行程序/命令foo三个文本文件"a.txt","b.txt","c.txt": #!/bin/bash for strname in "a" "b" "c" do foo $strname".txt" done 另外,假设foo $strname".txt"速度很慢,那么脚本的执行将花费很长时间(例如,数小时或数天)。nohup因此,即使终端处于关闭或断开状态,我也要使用继续执行。我还希望脚本立即转到后台,因此我将使用&运算符。因此,我将使用以下命令来调用script.sh: nohup bash script.sh & 这对于在后台运行脚本且没有挂断效果很好,但是现在假设我出于某种原因希望在某个时候终止执行。我怎样才能做到这一点? 我遇到的问题是,通过查看top,我只能看到与foo相对应的"a.txt"。我可以终止该foo调用,但是要调用的foo对应对象,然后也必须终止该调用,"b.txt"依此类推。对于for循环中指定的数十或数百个文本文件foo,一个接一个地终止是很痛苦的!因此,我需要以某种方式终止shell脚本本身,而不是终止从shell脚本发出的特定调用。 当我键入命令 ps -u myusername myusername我的用户名在哪里,我会得到一个正在运行的进程的列表。但是我看到了两个不同的进程ID bash。我如何知道这些过程中的哪一个(如果有的话)与我的原始呼叫相对应nohup bash script.sh &?


4
稳健地构建路径
假设我在Shell脚本中有几个变量(例如在zsh中): FOLDER_1, FOLDER_2, etc. 这些变量指的是从降序的文件夹/。例如,如果我有一条路/home/me/stuff/items 变量将是: FOLDER_1='home' FOLDER_2='me' FOLDER_3='stuff' 现在,说我想通过连接变量来构建相应的路径。一种可能的方法是按照以下方式构建路径: PATH=$FOLDER_1/$FOLDER_2/$FOLDER_3/ 但是,说一些变量FOLDER_i带有尾随的正斜杠,而另一些则不是(我们也不知道哪个),例如 FOLDER_1='home' FOLDER_2='stuff/' FOLDER_3='items' 我的问题是:我该如何稳健地构建路径?(例如,避免双斜杠,并在需要的地方添加它们)。 我认为这样做的一种方法是/在变量对之间添加Always,然后使用删除所有重复项sed,但是我无法使其正常工作(我不确定我在中/正确处理了sed)。 另外,我是否正在重新发明轮子?(即是否已经有内置的功能?)。 最后,如果变量位于数组中,例如FOLDERS,是否可以不循环而进行此操作?(或替代地,通过循环但不知道FOLDERS数组中有多少个)。


2
我可以使用什么幂等命令来建立指向目录的符号链接?
我想将命令放入外壳脚本中,该脚本将创建指向目录的符号链接,但是此脚本可以反复运行,因此在后续调用中,该命令不应更改任何内容。 这是目录结构: % tree /tmp/test_symlink /tmp/test_symlink ├── foo └── repo └── resources └── snippets ├── php.snippets ├── sh.snippets ├── snippets.snippets ├── sql.snippets └── vim.snippets 我想在foo/称为目录的片段中创建一个符号链接/tmp/test_symlink/repo/resources/snippets。 所以我跑: % ln -sfv /tmp/test_symlink/repo/resources/snippets /tmp/test_symlink/foo/snippets '/tmp/test_symlink/foo/snippets' -> '/tmp/test_symlink/repo/resources/snippets' 这给出了预期的结果。 % tree /tmp/test_symlink /tmp/test_symlink ├── foo │ └── snippets -> /tmp/test_symlink/repo/resources/snippets └── repo └── resources …

1
交互式外壳能否变为非交互式,反之亦然?
交互式外壳能否变为非交互式,反之亦然? 注意:我已经对“交互式和非交互式之间的区别是什么?”这一基本问题进行了大量研究,研究的结果使我提出了这个问题。 这个问题的序言很长,部分原因是至关重要的是我们为回答“交互”所使用的定义类型。定义可以是特定集合的任意标签;它可以描述各种特性;或者它可以为您提供信息,以帮助您预测行为和了解目的。 我们可以将这最后一种称为“动作定义”或“动态定义”,这是最有用的。 在中man 1p sh,给出了交互式外壳的以下定义: If the -i option is present, or if there are no operands and the shell’s standard input and standard error are attached to a terminal, the shell is considered to be interactive. 从提及“ -i选项”和使用“操作数”一词开始,这是指Shell的调用,而不是可以在运行中的Shell中检查的属性。 Bash手册页的措辞略有不同: An interactive shell is one started without non-option …


1
等待bash-builtin以100%的速度消耗CPU
至少在GNU bash版本4.3.42 x86_64和&GNU bash版本4.3.11 x86_64上发生 我用sleep & wait $!一个简单的方法而不是简单的方法sleep来获得sleep信号的可中断性(如SIGUSR1)。但是wait当您运行以下命令时,bash-builtin的行为似乎很奇怪。 1号航站楼: cat <( trap 'echo SIGUSR1' SIGUSR1; echo $BASHPID; while :;do sleep 1 & wait $!; echo test; done )& 2号航站楼: kill -10 /the pid of the subshell, printed by the previous command/ 1号航站楼: ^C (ctrl + C) 然后,我得到了以100%消耗CPU的子外壳。 1号航站楼: pkill …


3
bash脚本错误stty:标准输入:设备的ioctl不适当
我在bash脚本中使用here-documents来自动执行安装和设置,而该操作需要多次输入密码。我输入一次密码,脚本将其传递给各种命令。在大多数情况下,此处文档方法可以很好地解决这一问题。但是,在一种情况下,我得到此错误: Enter VNC password: stty: standard input: Inappropriate ioctl for device Verify password: stty: standard input: Inappropriate ioctl for device 请注意,此错误消息来自x11vnc -storepassword(而不是来自)sudo。 我的问题与x11vnc -storepasswd,这是我的代码: sudo x11vnc -storepasswd ~/.vnc/passwd << ENDDOC password password y ENDDOC 显然(由于错误)不起作用。我将感谢一个如何sudo x11vnc -storepasswd ~/.vnc/passwd在脚本中实现的可行示例。 如果有帮助,则提示如下所示: 输入VNC密码: 验证密码: 将密码写入/home/user/.vnc/passwd?[y] / nn 使用expect会是更好的解决方案吗?如果是这样,在这种情况下我将如何使用它?(我以前从未使用expect过,但是自发布此问题以来,我查看了很多示例,因此我无法expect独自工作。)

1
在zsh中执行脚本-文件权限
我对执行文件权限不符合我的预期感到困惑。可能是因为我的期望是错误的。无论如何: 我有一个脚本文件,为了简单起见s,它位于中~/bin。对于此示例,文件仅包含以下几行: #!/bin/zsh echo "Test"; 很简单的。 我导航到~/bin目录,并chmod具有sto 的文件权限400-即,仅对我只读。没有执行权限。因此,我尝试通过输入脚本路径来执行脚本,并给出以下内容: % ./s zsh: permission denied: ./s 到目前为止,一切都很好。由于权限错误,无法执行该文件。将权限提升到最高500(授予执行权限)也可以正常工作-使用这些权限,文件可以正常执行: % ./s Test 这完全符合预期。但是然后我将chmod权限放回至400(再次关闭执行权限),尝试source处理该文件,然后发生这种情况: % source s Test 虽然权限是 400,但脚本将执行。 所以这是我的问题:为什么会./s失败(应该如此),但是source s正常执行?这不会破坏执行权限的全部目的吗? 在400权限下,sh s以及zsh s同时工作。 我确定我在做某事或在某处了解严​​重错误。可有人指出哪里给我,并解释之间的区别./s,source s,sh s和zsh s?

4
用sed处理bash变量
bash变量LATLNG像这样在方括号中包含纬度和经度值 (53.3096,-6.28396) 我想将它们解析成一个名为LAT和LON的变量,我正试图通过sed像这样 LAT=$(sed "s/(\(.*\),\(.*\))/\1/g" "$LATLNG") LON=$(sed "s/(\(.*\),\(.*\))/\2/g" "$LATLNG") 但是,出现以下错误: sed: can't read (53.3096,-6.28396): No such file or directory

4
循环遍历变量
我正在编写一个bash脚本,以在大约20台不同的服务器上使用rsync并更新文件。 我想通了rsync部分。我遇到的麻烦是要遍历变量列表。 到目前为止,我的脚本如下所示: #!/bin/bash SERVER1="192.xxx.xxx.2" SERVER2="192.xxx.xxx.3" SERVER3="192.xxx.xxx.4" SERVER4="192.xxx.xxx.5" SERVER5="192.xxx.xxx.6" SERVER6="192.xxx.xxx.7" for ((i=1; i<7; i++)) do echo [Server IP Address] done [Server IP Address]关联变量的值应在哪里。因此,当i = 1时,我应该回显$ SERVER1的值。 我已经尝试过几次迭代,包括 echo "$SERVER$i" # printed the value of i echo "SERVER$i" # printer "SERVER" plus the value of i ex: SERVER 1 where i …

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.