Bash:从文件中读取命令

时间:2014-10-21 18:12:15

标签: linux bash sed grep

我使用的是Debian的最小netinstall映像。这是我在第一次登录时启动用户进程和守护进程的脚本。它逐行读取由命令组成的文件,检查它们是否已经运行并启动它们,如果不是:

#!/bin/bash
## This script reads a list of user startup daemons and launches them after the first login

STAT=`who | grep "$USER" | wc -l` ## Get login count
if [ "$STAT" -eq 1 ] ; then ## If login shell
  while IFS=' ' read line  ## First attempt to separate fields fails
  do
    CMD=`echo "$line" | grep -v ^\#` ## Use non comment lines only
    if [ -n "$CMD" ] ; then
      eval set "$CMD" ## The actual field separation
      APPID=$(pgrep "$1")&& ## Check if process $1 of $CMD is already active and launch it if not
        (echo "$1 already active as "$APPID) || ("$@" 1>/dev/null&& echo "Started $1 as $(pgrep "$1")")
    fi
  done < ~/.scripts/daemons
  echo "start-daemons: Finished"
else
  echo "start-daemons: Not a login shell"
fi

命令~/.scripts/daemons的文件如下所示:

## List of processes / daemons to start at user login
## <command> <argument1> <argument2> ..
mpd
pulseaudio -D
gpg-agent --daemon --enable-ssh-support --write-env-file /tmp/.gpg-agent-info

该脚本适用于mpd。但问题是,由命令和(多个)选项(以及空格)组成的行不会被分割成字段。将字段分隔符IFS设置为&#39; &#39;没有区别,我觉得很奇怪。在这种情况下有什么问题?谢谢!

编辑:正如alvits所建议的那样,通过在while循环中评估set $line进行字段分离,提供了一种简单的解决方法。但是为什么read line首先没有分离?

2 个答案:

答案 0 :(得分:0)

我认为你应该检查&#34; pgrep pulseaudio&#34; 。也就是说,仅使用进程/守护程序名称,而不是将进程/守护程序名称与选项一起提供。我没有机器,我现在可以测试它。这可以通过从每一行获取第一个字段(这将是进程/守护程序名称)来完成。同样的第二个。您可以尝试的另一件事是pgrep的&#34; -f&#34; 选项。试试让我知道

答案 1 :(得分:0)

知道了:read需要知道应该拆分一行的字段。通过将第6行更改为

 while IFS=' ' read field1 field2

field1将包含该命令,而field2具有选项,可以再次包含空格,因为field1之后的任何内容都属于field2。