스크립트에 sudo 및 비 sudo 명령이 모두 있는 경우 터미널에서 스크립트의 모든 줄에 대한 stdout 및 stderr을 확인하세요.

스크립트에 sudo 및 비 sudo 명령이 모두 있는 경우 터미널에서 스크립트의 모든 줄에 대한 stdout 및 stderr을 확인하세요.

sudo로 다음 스크립트를 실행하고 있습니다.

#!/bin/bash

whoami
echo $USER ~
sudo -u blueray bash <<"DOF"
whoami
echo $USER ~
DOF

echo "Running script as user $(whoami)"
sudo -u blueray echo "Running script as user $(whoami)"
sudo -u blueray bash -c 'echo "Running script as user $(whoami)"'

다음과 같은 결과를 얻었습니다.

% sudo bash test.sh 2>&1 | tee --append /tmp/log.txt
root
root /root
blueray
blueray /home/blueray
Running script as user root
Running script as user root
Running script as user blueray

내 문제는 sudo 명령과 sudo가 아닌 명령이 모두 포함된 스크립트를 실행하려고 한다는 것입니다.

이것제안sudo -u username command스크립트에서 이 줄을 사용하면 지정된 사용자로 실행됩니다 . 그러나 내 연구 결과는 그렇지 않다는 것을 암시합니다. sudo -u blueray bash -c내 경우 에만 작동합니다. 그러나 서브쉘은 bash -c다르게 작동합니다.

% var=value
% bash -c 'echo $var'
% (echo $var)
value

그러니 이것이 내가 정말로 원하는 것인지 이해하지 마십시오.

또한 스크립트를 병렬이 아닌 순차적으로 실행하고 싶습니다. sudo -u blueray bash -c다른 쉘을 열고 병렬로 실행할 수 있는지 확실하지 않습니다 .

전체적으로 나는 원한다터미널에서 스크립트의 모든 줄에 대한 stdout 및 stderr 보기. 나는 원해요특정 줄을 제외하고 sudo로 스크립트를 실행합니다.. 나는 원해요병렬이 아닌 순차적으로 스크립트 실행.

내 스크립트는 다음과 같습니다

#!/bin/bash

apt update
apt upgrade -y
apt install -y git zsh zsh-autosuggestions zsh-syntax-highlighting python3 python-is-python3 python3-pip mdadm
chsh -s $(which zsh)

mdadm --assemble --scan

tee -a /etc/fstab << END
LABEL=8TBRaid0 /media/blueray/8TBRaid0  ext4  nosuid,nodev,nofail,x-gvfs-show  0  2
LABEL=WDPurple8TB /media/blueray/WDPurple8TB  ext4  nosuid,nodev,nofail,x-gvfs-show  0  2
LABEL=WDPurple6TB /media/blueray/WDPurple6TB  ext4  nosuid,nodev,nofail,x-gvfs-show  0  2
END

curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg arch=amd64] https://brave-browser-apt-release.s3.brave.com/ stable main"| tee /etc/apt/sources.list.d/brave-browser-release.list

add-apt-repository -y ppa:christian-boxdoerfer/fsearch-stable

apt update
apt upgrade -y

apt install -y foliate brave-browser

curl -sSL https://get.docker.com/rootless | sh
systemctl --user start docker.service
systemctl --user enable docker.service
loginctl enable-linger blueray

wget -O firefox.tar.bz2 "https://download.mozilla.org/?product=firefox-latest-ssl&os=linux64&lang=en-US"
tar xjf firefox.tar.bz2
apt remove firefox
mv firefox/ /opt/firefox
rm firefox.tar.bz2
ln -s /opt/firefox/firefox /usr/bin/firefox
desktop-file-install /media/blueray/WDPurple6TB/_Working/_NotesFiltered/linux-mint/supporting-files/Firefox.desktop

pip install yapf

답변1

출력을 잘못 해석하고 있지만 이해하기 쉽지만 혼란스럽습니다. 구체적으로 다음 줄은 다음과 같습니다.

sudo -u blueray echo "Running script as user $(whoami)"

이는 echouser 로 실행 되지만 blueray명령의 모든 내용은 echo가 시작되기 전에 확장됩니다. 이것이 쉘이 작동하는 방식입니다. 이것이 echo $var바로 string 대신 변수 값이 인쇄되는 이유입니다 $var. 즉, 위의 명령을 실행하면 다음과 같은 일이 발생합니다.

  1. 쉘은 $(whoami)명령의 출력으로 확장 됩니다 whoami.root
  2. 쉘 호출은 echo확장된 값을 전달합니다.

그래서 실제로 실행하는 것은

sudo -u blueray echo "Running script as user root"

예상한 동작을 얻으려면 작은 따옴표가 확장을 방지하므로 큰 따옴표 대신 작은 따옴표를 사용하여 새 셸을 호출하고 명령을 실행하도록 지시해야 합니다.

sudo -u blueray bash -c 'echo "Running script as user $(whoami)"'

표시하려면:

$ sudo -u bib echo "Running script as user $(whoami)"
Running script as user terdon

$ sudo -u bib sh -c 'echo "Running script as user $(whoami)"'
Running script as user bib

따라서 다른 사용자로 특정 명령을 실행하려는 경우, 예, 수행 방법은 다음과 같습니다. whoami당신을 혼란스럽게 만드는 것은 단지 출력일 뿐입니다 .

관련 정보