2014-10-21 5 views
0

데비안의 최소 netinstall 이미지를 사용하고 있습니다. 다음은 첫 번째 로그인시 사용자 프로세스와 데몬을 시작하는 스크립트입니다. 그것은하지 않을 경우, 이미 실행중인 경우, 선으로 명령 라인으로 구성된 검사 파일을 읽고이를 실행 :Bash : 파일에서 명령어 읽기

## 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 

스크립트 작품 :

#!/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) || ("[email protected]" 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의 파일은 다음과 같이 보인다 mpd입니다. 그러나 문제는 명령과 (여러) 옵션 (및 공백)으로 구성된 행이 필드로 분할되지 않는다는 것입니다. 필드 구분 기호 IFS를 ''로 설정하면 아무런 차이가 없습니다. 이상하게 느껴집니다. 이 사건의 문제는 무엇입니까? 고맙습니다!

편집 : alvits에서 제안한대로 while 루프 내에서 set $line을 평가하는 필드 분리는 쉬운 해결 방법을 제공합니다. 그런데 왜 read line이 처음부터 분리되어 있지 않습니까?

+0

[ShellCheck] (http://www.shellcheck.net/)을 통해 스크립트를 실행하고 해당 문제를 수정 한 다음 질문을 편집 할 수 있습니까? 또한'pgrep'에'--'를 추가하십시오 (즉,'pgrep - "$ 1"'). 100 % 확신 할 수는 없지만 문제를 이해하는 단어 나 '-'를 옵션으로 해석하는 명령이 될 수 있습니다. – BroSlow

+0

'check_process()'안에'eval set $ 1'을 첫 번째 문장으로 삽입하십시오. 'eval'을 사용하는 것은보기 흉하지만 여러분의 경우에 가장 쉽습니다. – alvits

답변

0

"pgrep pulseaudio"으로 확인해야한다고 생각합니다. 즉, 프로세스/데몬 이름을 옵션과 함께 제공하는 대신 프로세스/데몬 이름 만 사용하십시오. 나는 지금 이것을 시험 할 수있는 기계가 없다. 이것은 각 행 (프로세스/디먼 이름이 됨)에서 첫 x 째 필드를 취함으로써 수행 할 수 있습니다. 두 번째 경우에도 마찬가지입니다. 시도 할 수있는 또 하나의 일은 pgrep의 "-f" 옵션입니다. 시도해주세요

+0

당신 말이 맞아요. 나는 첫 번째 인수 $ 1을 pgrep에 전달하여이를 우회하려고한다. 그러나 그 방법은 효과가 없습니다. 대신 전체 선이 통과됩니다. – anarki

0

알아두기 : read 줄을 분할해야하는 필드를 알아야합니다. 필드 1 후 아무것도 필드 2에 속하기 때문에 FIELD2가 다시 공백을 포함 할 수있는 옵션을 가지고 있지만, 명령을 포함

while IFS=' ' read field1 field2 

필드 1에 라인 (6)을 변경하여.

+0

잘 했어, IFS는 일반적으로 "그래야 해. 아프지 않아야 해. –