`apt update` 및`apt upgrade` 명령의`apt up` 부분을 재사용하여 단 한 줄로 순차적으로 실행하십시오


11

별명없이 한 줄로 두 명령을 순서대로 실행하기 위해 and 명령 의 apt up일부 를 재사용하는 방법 .apt updateapt upgrade

같은 것 : apt up{date,grade}.


실제로 이것을 달성하는 목표는 무엇입니까? 왜 이것이 흥미 롭거나 관련이있을 수 있습니까?
바나듐

25
@vanadium 우리는 리눅스 사용자는 우리 누구도 우리의하자가 될 솔직히 아무도 여기에 없을 것이다 않았다 경우 무의미한 일을 시도하는 것은, 우리가 더 복잡한 것들을 나중에 적용 할 수있는 기술을 배울 수 있습니다입니다
대런 H

1
@DarrenH 그것은 내가 정말로 생각한 것입니다 :-)
vanadium

답변:


19

간단한 방법 (보다 효율적인)은 for 루프를 사용하는 것입니다 (한 줄에 있지만 명확성을 위해 여러 줄로 표시됨).

for i in {date,grade}; do
     apt up${i}
done

현명한 방법은 ~/.bashrc이 두 명령 의 별칭을 만들고 다시 입력하는 것을 잊어 버리는 것입니다.

alias upgrade=' sudo apt update && sudo apt upgrade'

정교한 방법은 다음과 같습니다.

$ echo sudo" "apt" "up{"date","grade"}" && " :
sudo apt update &&  sudo apt upgrade &&  :

무슨 일인지 알 겠어? 우리는 쉘이 실행할 유효한 텍스트 문자열을 만들고 있습니다. 이제는을 eval대신 사용하면 됩니다 echo. 그러나 eval일반적으로 쉘 스크립팅에서는 권장되지 않으며이 명령은 for 루프보다 훨씬 복잡하고 이식성이 없습니다. 평가없이 테마에 변화 (최단 지금까지,하지만 효율적으로 인해 파이프와 다수의 명령에 echo,이 apt, sudosh분기의 많은 정도) :

$ echo "apt "{update,upgrade}";"|sudo sh

우리는 또한 사용할 수있는 set위치 매개 변수에 원하는 순서를 설정하고 바로 실행 apt$1$2인수 :

$ set {update,upgrade}; echo apt $1 && echo apt $2
apt update
apt upgrade

또는 for 루프에서 시퀀스를 지정하지 않으면 위치 매개 변수를 처리하도록 기본 설정되므로 for 루프를 다시 사용하십시오. for variable (sequence)

$ set {update,upgrade} ; for i; do echo apt $i ;done
apt update
apt upgrade

사용 set은 쉘을 많이 사용하는 전문가들 사이에서 볼 수있는 매우 일반적인 기술이며, 그 이유는 매우 이식성이 뛰어나 /bin/sh배열이나 {a,b,c}확장 이없는 곳 에서 작동 합니다. POSIX-ly 휴대용 방법은 다음과 같습니다 set update upgrade ; for i; do echo apt $i ;done. 또한 이것은 효율적이어야합니다.


또는 우리는 while루프 경로를 갈 수 있습니다 :

$ echo {date,$'\n',grade}|while read i;do echo apt up${i}; done 
apt update
apt upgrade

물론 echo실제 명령을 실행 하지 않고 실행해야합니다.


7
한 줄에서 for 루프를 수행하십시오. for i in {date,grade}; do sudo apt up${i}; done
Videonauth

3
파일을 깔끔하고 깔끔하게 유지하려면에 별칭을 넣을 수도 ~/.bash_aliases있습니다. 이 파일은에 의해 자동으로 제공됩니다 ~/.bashrc.
francescop21 년

2
나는 아마도 당신이 원하는 것으로 대답을 업데이트했습니다. 하나의 라이너이지만 더 쉽게 만들 수 있다고 생각하지 않습니다. 솔직히 말해서, apt다른 인수 (업데이트 및 업그레이드)로 두 개의 명령 (예, 두 개의 명령) 을 실행하려고 할 때이 작업을 수행 할 필요가 없으므로 for 루프가 계속 진행됩니다.
Sergiy Kolodyazhnyy

1
루프 헤더의 문자열 확장을위한 필요, 그냥 반복 이름없는 :for i in date grade; do
rexkogitans

5
이러한 별칭은 분명히 이름이 지정되어야합니다 upgrate.
파이프

14

bash history expansion 을 사용 하여 현재 명령 행의 일부를 가져 와서 수정할 수 있습니다.

$ apt update; !#:s/date/grade
apt update; apt upgrade;
Reading package lists... Done
...
  • !# 현재 줄입니다
  • :s/date/grade개질제 그 대체품이다 dategrade

6
!#:s/dat/grad대신 사용하여 2 개의 문자를 더 저장할 수도 있습니다
Dan

9

xargs대신에 사용 하는 또 다른 간단한 옵션 for:

echo up{dat,grad}e | xargs -n1 apt

테스트:

$ echo up{dat,grad}e | xargs -n1 echo apt
apt update
apt upgrade

그러나 Sergiy와 같은 쉘 별명을 선호합니다. 이러한 "간단한"방법은 실제로 유용 할 정도로 단순하지 않기 때문입니다.


1
아주 좋아요 테마 printf "%s\n" {date,grade} | xargs -I% -n1 echo apt up%는 조금 더 길지만 테마에 변형 이 있을 수 있습니다.
Sergiy Kolodyazhnyy

printf '%s'예를 들어 --help또는로 이스케이프 할 수 없으므로 일반적으로 좋은 방법 -e입니다.
yyny

@YoYoYonnY 예. 아마도 printf '%s\0'더 좋을 것입니다. xargsnull로 끝나는 인수를 처리하는 플래그가 있습니다
Sergiy Kolodyazhnyy

2

다음과 같은 함수를 작성하십시오.

repeat() { 
    for suffix in "${@:2}";
    do
        eval "$1""$suffix";
    done
}

그런 다음을 실행할 수 있습니다 repeat 'apt up' {date,grade}. 이것은 완전히 다른 명령에 재사용 할 수 있다는 이점이 있지만이 명령을 입력하면 저장하지 않습니다.

나는 이것과 같은 것이 더 유용 할 것이라는 다른 대답들 중 일부에 분명히 동의합니다.

alias apt-up='apt update && apt upgrade'

0

@muru의 대답으로 역사 확장 에 대해 읽었으며 다른 변형을 발견했습니다.

 $ sudo apt update
 $ ^dat^grad^

^string1^string2^동등하다 !!:s/string1/string2/마지막 명령을 대체 소요 string1와 함께 string2.


-2

apt-get up다음 키 시퀀스를 사용하여 명령 의 일부를 재사용합니다 .

Up ArrowBackspaceBackspaceBackspaceBackspace

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.