리눅스 설치 시 사용할 스크립트를 만들고 싶습니다.

phi의 이미지

이와 관련해서 larbs라고 괜찮은게 있어서 잘 뜯어서 사용해보려 합니다.
(스크립트 주소: larbs.xyz/larbs.sh)

그런데 다음 내용이 뭘 뜻하는건지 잘 몰라서 완전하게 제 것으로 만들기가 애매해서 질문 올립니다.

1.조건문

[ -z "$aurhelper" ] && aurhelper="yay"

이라는 부분이 있습니다.
if [ -z "$A" ] ~ 같은 형태가 아니라 바로 저렇게 쓰던데
편하게 쓸 때 저렇게 하는건가요?

2. aurinstall 함수

maininstall() { # Installs all needed programs from main repo.
	dialog --title "LARBS Installation" --infobox "Installing \`$1\` ($n of $total). $1 $2" 5 70
	installpkg "$1"
	}
 
gitmakeinstall() {
	dir=$(mktemp -d)
	dialog --title "LARBS Installation" --infobox "Installing \`$(basename "$1")\` ($n of $total) via \`git\` and \`make\`. $(basename "$1") $2" 5 70
	git clone --depth 1 "$1" "$dir" >/dev/null 2>&1
	cd "$dir" || exit
	make >/dev/null 2>&1
	make install >/dev/null 2>&1
	cd /tmp || return ;}
 
aurinstall() { \
	dialog --title "LARBS Installation" --infobox "Installing \`$1\` ($n of $total) from the AUR. $1 $2" 5 70
	echo "$aurinstalled" | grep "^$1$" >/dev/null 2>&1 && return
	sudo -u "$name" $aurhelper -S --noconfirm "$1" >/dev/null 2>&1
	}
 
pipinstall() { \
	dialog --title "LARBS Installation" --infobox "Installing the Python package \`$1\` ($n of $total). $1 $2" 5 70
	command -v pip || installpkg python-pip >/dev/null 2>&1
	yes | pip install "$1"
	}
 
installationloop() { \
	([ -f "$progsfile" ] && cp "$progsfile" /tmp/progs.csv) || curl -Ls "$progsfile" | sed '/^#/d' | eval grep "$grepseq" > /tmp/progs.csv
	total=$(wc -l < /tmp/progs.csv)
	aurinstalled=$(pacman -Qqm)
	while IFS=, read -r tag program comment; do
		n=$((n+1))
		echo "$comment" | grep "^\".*\"$" >/dev/null 2>&1 && comment="$(echo "$comment" | sed "s/\(^\"\|\"$\)//g")"
		case "$tag" in
			"A") aurinstall "$program" "$comment" ;;
			"G") gitmakeinstall "$program" "$comment" ;;
			"P") pipinstall "$program" "$comment" ;;
			*) maininstall "$program" "$comment" ;;
		esac
	done < /tmp/progs.csv ;}

installationloop 함수를 이용해서, 미리 작성된 프로그램 목록에 있는 프로그램을
aur을 이용할지 git을 이용할지 등을 결정해서 설치하는 함수입니다.

여기서 aurinstall함수를 보시면

echo "$aurinstalled" | grep "^$1$" >/dev/null 2>&1 && return

라는 부분이 있는데 이게 뜻하는게 뭔지 잘 모르겠습니다.
추측하기에는 이미 설치 되어 있다는 이 함수를 종료한다? 그런거 같은데 맞을까요?

3. newperms 함수

newperms() {
	sed -i "/#LARBS/d" /etc/sudoers
	echo "$* #LARBS" >> /etc/sudoers ;}

newperms "%wheel ALL=(ALL) ALL #LARBS
%wheel ALL=(ALL) NOPASSWD: /usr/bin/shutdown,/usr/bin/reboot,/usr/bin/systemctl suspend,/usr/bin/wifi-menu,/usr/bin/mount,/usr/bin/umount,/usr/bin/pacman -Syu,/usr/bin/pacman -Syyu,/usr/bin/packer -Syu,/usr/bin/packer -Syyu,/usr/bin/systemctl restart NetworkManager,/usr/bin/rc-service NetworkManager restart,/usr/bin/pacman -Syyu --noconfirm,/usr/bin/loadkeys,/usr/bin/yay,/usr/bin/pacman -Syyuw --noconfirm"

설치단계에서 newperms 함수를 이렇게 활용하던데
newperms함수를 봤을때 어떻게 저렇게 활용하는건지 잘 모르겠습니다.
다음 프로그램을 사용할때는 비밀번호를 묻지 않게 하려는거 같은데
작동 원리를 잘 모르겠습니다.
추측하기에는 두번째줄은 newperms의 변수?옵션?으로 활용되는게 아니라
별개의 스크립트로 작동하는거 같은데 맞나요?
만약 맞다면, visudo에서 본 적 있는 문구같은데
쉘스크립트로 그냥 입력해도 적용이 되는거였나요?

4. 2>&1
스크립트 실행 결과가 필요 없을때 2>&1와 같은걸 뒤에 붙여주는 것으로 알고 있습니다.
그런데 여기서 자주 사용되는

3>&1 1>&2 2>&3 3>&1

는 어떤 의미를 가진건지 이해가 되지 않습니다.
1>이나 2> 이런식으로 따로 쓸 수 있는건 알고있는데
갑자기 3은 왜 있는거며, 1>&2는 뭐고..
잘 이해가 되지 않습니다.

부탁드립니다.

김정균의 이미지

원하시는 내용은 너무 광범위 합니다. 설명이 꼬리를 물어야 하는 사항입니다.
https://mug896.github.io/bash-shell/
의 글을 한번 쭈욱 읽어 보시기 바랍니다. 보시다 보면 님이 궁금하던 부분들이 나올 겁니다.

요약하자면

1. https://mug896.github.io/bash-shell/test.html 참고
2. pacman 으로 설치된 리스트를 aurinstalled 변수가 가지고 있고, aurinstall 함수의 첫번째 argument 로 넘어온 값이 aurinstalled 변수에 있으면 함수를 중지 하라는 의미입니다.
3. /etc/sudoers 파일을 편집 하고 있는 겁니다. sed 명령어와 bash redirection 에 대해서 알아 보세요.
4. https://mug896.github.io/bash-shell/redirections.html 참고 하세요.

phi의 이미지

감사합니다. 천천히 읽어보겠습니다.

phi의 이미지

읽어보니 정말 제가 찾던 자료네요.
감사합니다.

phi의 이미지

제가 이해한게 맞다면

3>&1 1>&2 2>&3 3>&1

는 0입력 1에러출력 2일반출력 3에러출력
이렇게 됩니다.
이게 사용되는 부분은 유저 이름과 패스워드를 입력하는 함수린데,
굳이 이렇게 하는 이유가 뭔가요?
보안과 관련된건가요?

좀더 생각해봤는데
2번이 일반출력이니 에러가 생기면 터미널에 출력하고
1번이 에러인데 일반 출력이 에러로 출력되지 않으니? 터미널에 출력되지 않습니다.
그러니까 sudo를 사용할때처럼
잘못입력하면 알려주고
제대로 입력하면 보여주지 않는
그런걸 구현하는건가요?

익명 사용자의 이미지

0 stdin
1 stdout
2 err

3 은모르겠습니다

ymir의 이미지

자세한 것은 dialog 의 man page 나 소스를 봐야하겠지만..
원하는 값(passwd) 이 stderr 로 출력되는듯 합니다..

이를 변수에 넣고 뭔가 하려면 stdout 으로 바꿔야 하니까..
3>&1 1>&2 2>&3 3>&1 과 같이 덧붙여서, fd 를 바꿔준 듯 합니다.
1 과 2 가 서로 swap 되고, 3 은 이를 위해 임시로 사용한 fd 로 보입니다.

순서대로 값을 적용해 보면 다음과 같이 최종적으로 fd 가 변할겁니다.

fd1 = 1
fd2 = 2
fd3 = 3 -> 1 (fd1)

fd1 = 1 -> 2 (fd2)
fd2 = 2
fd3 = 3 -> 1

fd1 = 1 -> 2
fd2 = 2 -> 1 (fd3)
fd3 = 3 -> 1

fd1 = 1 -> 2
fd2 = 2 -> 1
fd3 = 3 -> 1 -> 2 (fd1)

아래는 참고용...

$ cat a.sh
#!/bin/bash
echo "fd1"
echo "fd2" >&2
echo "fd3" >&3
$ bash a.sh
fd1
fd2
a.sh: line 4: 3: Bad file descriptor
$ bash a.sh 1>fd1.txt 2>fd2.txt 3>fd3.txt
$ grep "" fd?.txt
fd1.txt:fd1
fd2.txt:fd2
fd3.txt:fd3
$ A=$(bash a.sh)
fd2
a.sh: line 4: 3: Bad file descriptor
$ echo $A
fd1
$ A=$(bash a.sh 3>&1 1>&2 2>&3 3>&1)
fd1
fd3
$ echo $A
fd2

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.