제목이 문제를 설명하는 데 가장 적합하지 않을 수도 있지만, 내가 하려는 작업을 계속해서 설명하는 것이 내가 생각해 낼 수 있는 최선입니다. 저는 artix runit을 OS로 사용하여 다음에 대한 심볼릭 링크를 만듭니다. 서비스이므로 더 쉽게 만들기 위해 이 스크립트를 만들었습니다.
#!/bin/sh
rundir="/run/runit/service"
svdir="/etc/runit/sv"
for SERVICE in $(ls $svdir); do
[[ -d "$rundir/$SERVICE" ]] && output="$output$SERVICE linked: yes\n" || output="$output$SERVICE linked: no\n"
done
service=$(printf "$output" | dmenu -l 10) || exit 1
if printf "$service" | grep -Fqe "linked: yes"; then
service=$(printf "$service" | awk '{print $1}')
sudo -A rm "$rundir/$service"
else
service=$(printf "$service" | awk '{print $1}')
sudo -A ln -s "$svdir/$service" "$rundir/"
fi
활성화할 수 있는 모든 서비스를 확인 /etc/runit/sv
하고 존재 여부를 확인하여 이미 활성화되어 있는지 확인합니다. 존재 하는 경우 dmenu 목록 끝에 /run/runit/service
추가하고 , 그렇지 않은 경우 서비스 이름이 다양하다는 문제를 추가합니다. 따라서 이를 추가하면 다음과 같은 불일치가 발생합니다.
linked: yes
linked: no
보시다시피 서비스 이름에 따라 끝 부분에 텍스트 위치가 바뀌기 때문에 눈에 별로 매력적이지 않아서 해결 방법이 없는지 묻고 싶습니다. 문제를 해결할 수 있으므로 처음에 추가하겠지만 linked: xxx
이것이 최후의 수단입니다. 코드를 작성하는 더 효율적인 방법을 지적하려는 사람이 있다면 그렇게 하십시오. 이것은 나의 첫 번째 bash 스크립트이고 아직 배울 것이 많습니다. 참고: 저는 sh로 대시를 사용하고 있으므로 어떤 종류의 bashism도 사용할 수 없습니다.
답변1
printf
를 사용하여 매개변수의 형식을 특정 길이로 지정할 수 있습니다 . 필요에 따라 조정하여 20자 왼쪽 정렬을 선택했습니다.
코드를 일부 조정하세요.
#!/bin/sh
rundir="/run/runit/service"
svdir="/etc/runit/sv"
cd "$svdir"
result=$(
for service in *; do
printf '%-20s linked: %s\n' "$service" $([ -d "$rundir/$service" ] && echo yes || echo no)
done | dmenu -l 10
) || exit 1
service=$(echo "$result" | awk '{print $1}')
case $result in
*yes)
sudo -A rm "$rundir/$service"
;;
*no)
sudo -A ln -s "$svdir/$service" "$rundir/"
esac
변경 목록:
[ expression ]
테스트를 위해[[ ... ]]
대시에 표시되지 않음*
대신 에 작동하게 하려면ls
하나가 필요해요cd
- 변수를 제거
$output
하고 루프의 출력을 다음으로 파이프합니다.dmenu
- if-else 대신 Case 문