标签: bash-script

run-parts(8) 实用程序的目的

至少在基于 Debian 的系统下,debianutils包中有一个run-parts实用程序,可用于各种脚本。例如在 /etc/X11/Xsession.conf 中。它将运行在目录中找到的所有可执行文件。为什么需要运行部件而可以与选项或实用程序一起使用?另外,什么是可执行文件?看起来它不是简单地检查文件权限:find-permtestrun-parts

# run-parts --list --lsbsysinit /etc/X11/Xsession.d | tail -1
/etc/X11/Xsession.d/90x11-common_ssh-agent
# ls -l /etc/X11/Xsession.d/90x11-common_ssh-agent
-rw-r--r-- 1 root root 629 2010-11-02 23:17 /etc/X11/Xsession.d/90x11-common_ssh-agent
# head /etc/X11/Xsession.d/90x11-common_ssh-agent
# $Id: 90x11-common_ssh-agent 305 2005-07-03 18:51:43Z dnusinow $

# This file is sourced by Xsession(5), not executed.

STARTSSH=
SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS=

if has_option use-ssh-agent; then
  if [ -x "$SSHAGENT" ] && [ -z "$SSH_AUTH_SOCK" ] \
# 
Run Code Online (Sandbox Code Playgroud)

bash bash-script

6
推荐指数
1
解决办法
7613
查看次数

是否可以在 Debian 关机/重启时首先执行脚本?

我目前正在尝试注册一个脚本(位于 /etc/init.d 中),使该脚本在关机/重启时作为第一个脚本/程序执行(更改为运行级别 0 或 6)

我曾经update-rc.d stop_servers stop 0 0 6 .为这两个运行级别注册脚本。它在那里正确注册,但名称为K01stop_servers。这使得脚本不会作为第一个被执行。
我基本上需要一切仍在运行。这就是为什么我希望它是第一个。
也就是说,我仍然需要运行我的 apache、mysql 和 (s)ftp 服务器,并且我的 java 仍然功能齐全。

我如何实现这一目标?

脚本如下:

#! /bin/bash

### BEGIN INIT INFO
# Provides:          mc_server_safe_shutdown
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:
# Default-Stop:      0 6
# Description:       Shuts down all Minecraft serves softly
### END INIT INFO

/root/.stop_servers

exit 0
Run Code Online (Sandbox Code Playgroud)

shutdown debian init.d reboot bash-script

5
推荐指数
1
解决办法
5282
查看次数

将选定字段写入一行的 shell 脚本

我有一个日志文件trace.log,它打印时间戳、线程名称和事务方法以及事务 ID,如下所示。

2014-01-23 15:50:41,724 [catalina-exec-35] INFO  TRANSACTION getConnection REQUEST, ID=1308::
2014-01-23 15:50:41,725 [catalina-exec-33] INFO  TRANSACTION getConnection REQUEST, ID=1304::
2014-01-23 15:50:41,727 [catalina-exec-10] INFO  TRANSACTION getConnection REQUEST, ID=1298::
2014-01-23 15:50:41,727 [catalina-exec-24] INFO  TRANSACTION getConnection REQUEST, ID=1307::
2014-01-23 15:50:41,727 [catalina-exec-12] INFO  TRANSACTION getConnection DONE, ID=1305::
2014-01-23 15:50:41,733 [catalina-exec-10] INFO  TRANSACTION getConnection DONE, ID=1298::
2014-01-23 15:50:41,734 [catalina-exec-26] INFO  TRANSACTION getConnection REQUEST, ID=1313::
2014-01-23 15:50:41,734 [catalina-exec-26] INFO  TRANSACTION getConnection DONE, ID=1313::
2014-01-23 15:50:41,738 [catalina-exec-39] INFO  TRANSACTION getConnection REQUEST, ID=1311::
2014-01-23 15:50:41,733 [catalina-exec-35] INFO …
Run Code Online (Sandbox Code Playgroud)

grep bash shell-script cut bash-script

5
推荐指数
1
解决办法
1255
查看次数

更改多个文本文件中单个行号上的文本

假设我有十个 bash shell 脚本:script1.sh, script2.sh, ..., script10.sh. 最初,所有十个文件都是相同的。

现在,我想对每个脚本进行两​​个更改:

  1. 在每个文件中,我想更改一个特定的行(比如第 8 行)——也就是说,删除第 8 行中的任何内容并将其替换为我指定的“常量”字符串,例如"This is line 8." This is similar to this question,但他们想取代"AAA""BBB",而我想,以取代8号线(不管它是什么)"This is line 8."

  2. 在每个文件中,我想更改另一行(比如第 21 行)并将其替换为我指定的“变量”字符串。例如,在script1.sh我想将第 21 行更改为"XYZ"; 在script2.sh我想将第 21 行更改为"PQR"; 并且script3.sh我想将第 21 行更改为"ABC". 本质上,这只是对上面(1) 中函数的多次调用——除了我将在一个单独的文件中而不是在所有文件中进行更改,并且我指定了十个不同的字符串而不是一个。所以为了在这里获得(2),也许我会用不同的参数调用(1)十次不同的时间。

我感兴趣的是使用常用的Linux程序类似的解决方案bashviawk, …

awk vi text-processing bash-script

4
推荐指数
1
解决办法
3295
查看次数

如何让我的 bash 脚本看起来 100% 像一个 GUI 应用程序(所以用户永远不会看到终端)

我使用 kdialog 创建了一个 bash 脚本(它在 Kubuntu 12.04 上运行)。GUI 用于每个用户交互(在第一个之后)。但是,脚本仍然必须从终端启动并且终端仍然可见,即使用户不需要读取终端输出或在终端中输入任何内容。有没有一种简单的方法可以进入下一步并使我的 bash 脚本看起来 100% 像 KDE Gui 应用程序?

从下面 slm 和 Ilya Ananyev 的初步回答中,我看到制作 .desktop 文件可以实现这一点。这对我来说非常神奇,这就是我一直在寻找的简单答案。(我想要一个我可以在午餐时间完成的任务,并在剩下的时间里使用我的 bash 脚本来看起来像一个真正的 GUI 应用程序。).desktop 文件对于这个问题的其他读者来说也可能是正确的答案。

但是,在我的特定情况下,该脚本是一个安装程序脚本。所以我发现自己处于第 22 条军规中。如何安装 .desktop 文件以启动我的安装程序,而用户不必先为 .desktop 文件运行另一个安装程序?

此外,就我而言,该脚本由不了解计算机的最终用户使用。最终用户根据我的建议购买了一台预装了 Linux 的计算机。我的目标是让他们无需进入终端即可安装我的软件。(很可能他们以前从未见过命令提示符——他们中的一些人甚至不知道如何使用鼠标!)

所以,看起来,我的解决方案需要一些神奇的方式来安装 .desktop 文件,以便用户可以单击它来启动我的安装程序脚本。

总结一下,我的主要要求是:

  1. 一种在不显示终端的情况下启动脚本的方法。.desktop 文件将完成此操作。
  2. 一种在执行期间保持终端隐藏的方法(因为我完全依赖于 kdialog)。.desktop 文件将通过Terminal=falseset完成此操作。
  3. 可选地,用户输入其 sudo 密码的安全方式。我知道 kdialog 密码输入对话框,但我看到的使用示例并不安全。kdesudo 可能是一个解决方案,但它会多次重新提示输入密码,忽略 X 分钟的通常/默认 sudo 超时。所以它对我不起作用。
  4. 简单到可以在我的午餐时间实施。.desktop 文件将完成此操作。
  5. 在 kdialog 中使用我现有的 bash 脚本。.desktop 文件将完成此操作。
  6. 不需要用户在运行我的脚本之前进行额外的设置步骤。事实证明,KDE 用户可以单击位于任何位置的 …

bash gui kde4 dialog bash-script

4
推荐指数
1
解决办法
2691
查看次数

如何修复从 getopt 收到的参数?

我的脚本中有以下命令:

set -- `getopt -q agvc:l:t:i: "$@"` 
... 

while [ -n "$1" ] 
do 
-i) TIME_GAP_BOOT=$2 
shift ;; 

... 
sleep $TIME_GAP_BOOT
Run Code Online (Sandbox Code Playgroud)

使用 调用脚本时-i 2,出现错误

sleep: invalid time interval `\'2\''
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?如何正确格式化参数?

bash getopts bash-script

4
推荐指数
1
解决办法
2416
查看次数

通过 sudo 运行 nvm(bash 函数)

我想编写一个基本上应该运行的初始化脚本

nvm use v0.11.12 && forever start /srv/index.js
Run Code Online (Sandbox Code Playgroud)

作为用户webconfignvm是一个在 in 中声明的 shell 函数~webconfig/.nvm/nvm.sh,它通过source ~/.nvm/nvm.shinwebconfig.bashrc.

我尝试了以下方法:

sudo -H -i -u webconfig nvm

echo "nvm" | sudo -H -i -u webconfig
Run Code Online (Sandbox Code Playgroud)

但他们失败了

-bash:nvm:未找到命令
-bash:第 1 行:nvm:未找到命令

当我在该 shell 中手动运行sudo -H -i -u webconfig并输入时nvm,它可以工作。我究竟做错了什么?

bash sudo function bash-script

4
推荐指数
1
解决办法
3025
查看次数

比较多个文件

我想要一个 bash 脚本来比较或查找存储在不同位置的多个文件的差异:

下的文件 /tmp/test/

  • A.txt
  • B.txt
  • 文件

/home/oldtest/下的文件进行比较

  • A.txt
  • B.txt
  • 文件

健康)状况:

  1. 文件/tmp/test/A.txt仅与/home/oldtest/A.txt(与其他文件类似 -B.txt与 比较B.txt)。

  2. 如果发现任何更改:状态应为“文件 A.txt 中需要修改”。

file-comparison bash-script

3
推荐指数
2
解决办法
3万
查看次数

使用 BASH 打开任何类型的应用程序

我制作了一个可以打开任何应用程序的 Java 程序。假设有一个文件名“*.jpg”,它将允许操作系统识别应用程序的类型,然后打开默认应用程序。另一个例子:假设文件名是“*.flv”,那么它会打开默认的媒体播放器,就像你在 nautilus 中单击一个图标一样,但唯一的区别是它是在命令行中。这是为此的java程序:

import java.awt.*;
import java.io.*;
public class OpenFile{
    public static void main(String args[]){
      try{
          String filename = args[0];
          System.out.println(args[0]);
          Desktop.getDesktop().open(new File(filename));
      }
      catch(Exception e){
          System.out.println("Sorry an exception occured. Could not perform the operation.");
      }
    }
 }
Run Code Online (Sandbox Code Playgroud)

现在这个脚本会导致性能问题。现在我想写一个 BASH 脚本来完成这个任务??

application bash-script file-opening

3
推荐指数
1
解决办法
1405
查看次数

BASH : 数组作为字符串缓冲区

我设计了一个基于数组缓冲区来存储数据并在行计数器达到 MAX 值时写入数据,而不是显示(或写入)每个生成的结果。这是脚本:

#!/bin/bash
#Buffer Management
BUFFERCURSOR=0
BUFFERMAXSIZE=5
function bufferReset (){
    unset BUFFERVAR
    BUFFERCURSOR=0
}
function bufferAppend () {
    (( BUFFERCURSOR++ ))
    BUFFERVAR[$BUFFERCURSOR]="$1"
}
function bufferDisplay () {
    for ((i=1;i<=$BUFFERCURSOR;i++)); do printf "%s\n" "${BUFFERVAR[$i]}" ; done
}
#Buffer Management End:
for ((i=1;i<=8;i++)) ; do
    line=`printf "%3s" "$i ==> $(echo $i | md5sum|awk '{print $1}')"` #Example of a string to append
    bufferAppend "$line"
    if [ "$BUFFERCURSOR" == "$BUFFERMAXSIZE" ] ;    then
        bufferDisplay
        bufferReset
    fi
done
# Display …
Run Code Online (Sandbox Code Playgroud)

bash shell-script bash-script

3
推荐指数
1
解决办法
1563
查看次数