데비안의 최소 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
이 처음부터 분리되어 있지 않습니까?
[ShellCheck] (http://www.shellcheck.net/)을 통해 스크립트를 실행하고 해당 문제를 수정 한 다음 질문을 편집 할 수 있습니까? 또한'pgrep'에'--'를 추가하십시오 (즉,'pgrep - "$ 1"'). 100 % 확신 할 수는 없지만 문제를 이해하는 단어 나 '-'를 옵션으로 해석하는 명령이 될 수 있습니다. – BroSlow
'check_process()'안에'eval set $ 1'을 첫 번째 문장으로 삽입하십시오. 'eval'을 사용하는 것은보기 흉하지만 여러분의 경우에 가장 쉽습니다. – alvits