동일한 인수를 사용하여 여러 명령을 어떻게 실행합니까?


16

우분투 터미널에서 다음과 같이 연쇄 조치를 취할 수 있는지 궁금합니다.

action 1 on objectA . then action 2 on objectA 

더 이상 objectA의 이름을 반복하지 않아도됩니다.

예:

touch file.js && openEditor "$1" 

또는 그런 것.


이를 수행하는 방법은 많이 있지만 필요에 따라 다릅니다. ObjectA는 무엇입니까? 파일 ? 우리는 무엇에 대해 이야기하고 있습니까?
Sergiy Kolodyazhnyy 2018 년

감사합니다, 일반적으로 효과적으로 파일, 폴더도 될 수 있습니다
HoCo_

3
여기 &에서 "touch"명령을 백그라운드로 보냅니다. "터치 성공시 편집기 열기"를 원한다면, &&대신
glenn jackman

왜이 게시물을 부딪 히고 있습니까? 당신은 이미 많은 답을 얻었고 심지어 그것을 받아 들였습니다.
muru

답변:


27

bash는 함께 역사 확장 , 당신은 사용하여 현재 명령 줄의 n 번째 단어를 참조 할 수 있습니다 !#:n예를

$ touch foobar && ls -l !#:1
touch foobar && ls -l foobar
-rw-rw---- 1 steeldriver steeldriver 0 Jun 20 14:54 foobar

$ touch foo bar && ls -l !#:2
touch foo bar && ls -l bar
-rw-rw-r-- 1 steeldriver steeldriver 12 Jun 20 14:58 bar

어떤 bash 버전을 사용하고 있습니까?
Sergiy Kolodyazhnyy 2014 년

@SergiyKolodyazhnyy 이것은GNU bash, version 4.3.48(1)-release
스틸 드라이버

5
당신은 또한 단어의 범위를 지정할 수 있습니다 :touch foo bar && ls -l !#:1-2
glenn jackman

1
@HoCo_ !캐릭터 는 대화 형 쉘에 있을 때 히스토리 확장 표현을 소개합니다. 입력 할 때 즉시 명령 줄 조작을위한 것이며 비 대화식 스크립트에서는 비활성화되어 있습니다.
스틸 드라이버

1
@HoCo_ 스크립트에서 당신은 인수가 미리 무엇인지 알아야한다 - 그래서 예를 들어 당신은 그냥 할 수있는arg1=file.js; touch "$arg1" && openEditor "$arg1"
steeldriver

12

일반적인 사용 사례에 대한 편리한 바로 가기가 있습니다. 귀하의 예에서 당신은하고 있습니다 :

$ touch file.js
$ openEditor <alt>+<.>

두 번째 명령에서 트릭은 openEditor(공백 뒤에 공백을 두어) 뒤에 Alt+ 를 쓰는 것 .입니다. 마지막 명령 의 마지막 인수 인 을 삽입합니다 . ( 어떤 이유로 작동하지 않으면 작동 해야합니다.)file.jsAltEsc

종종 "개체"는 실제로 이전 명령의 마지막 인수이므로 자주 사용할 수 있습니다. 기억하기 쉽고 직관적으로 사용되는 쉘 단축키 세트에 빠르게 통합됩니다.

이 작업으로 할 수있는 일이 많이 있습니다. 여기에 대한 자세한 내용은 /programming/4009412/how-to-use-arguments-from-previous-command 입니다.

보너스로 이것은 bash뿐만 아니라 명령 줄 입력을 처리하기 위해 libreadline을 사용하는 모든 프로그램에서 작동합니다.


2
당신은 이것을 결합 할 수 있습니다 숫자 인수를 두 번째 인수 유지 얻기 위해, 예를 AltEnter 키를 누릅니다 2.(또는 Esc, 2, Esc, .), 마지막 인수 보도에 두 번째 얻을 Alt+ -를 입력 2하고 Enter를 누르 Alt+를 .(또는 Esc, -2, Esc, .).
디저트

@dessert 내가 여러 개의 인수를 원한다면 어떻게해야합니까? 예 내가 실행 echo 1 2 3 4한 후 내가 원하는 23다음 명령
wjandrea

@dessert 스스로 찾았습니다! 공백과 같이 그들 사이에 다른 것을 입력하면됩니다. 그것들을 연결하기위한 가장 쉬운 방법은 공백을 입력 한 다음 백 스페이스를 입력하는 것입니다.
wjandrea

1
@wjandrea hold Altand type 2., 스페이스 바를 누르고 hold Altand type 3.– 범위를 원하면 히스토리 확장을 사용하십시오 !!:2-3.
디저트

9

기본 대화식 쉘 bash및 스크립팅 쉘 의 경우 마지막 명령의 마지막 인수 를 호출 dash하는 $_데 사용할 수 있습니다 .

$ echo "Hello World"; echo same "$_"
Hello World
same Hello World

csh 및 tcsh에는 히스토리 참조가 있습니다. 특히 명령의 마지막 단어에 대해 !$및 개별 인수에 사용할 수 있습니다 !:<index>.

~% echo foo bar
foo bar
~% echo !$
echo bar
bar

% echo bar baz
bar baz
% echo !:1
echo bar
bar

일반적으로 objectA변수에 무엇이든 할당 하고 여러 명령, 루프 등에 사용하는 것이 좋습니다. 또는 함수를 선택할 수 있습니다.

$ foo(){ echo "$@"; stat --print="%F\n" "$@";}
$ foo testdir
testdir
directory

1
나는 역사에 명령을 저장하기 전에 후자가 확장 될 때와 $_약간 다르게 작동 한다는 것을 지적하고 싶습니다 !#:n. 따라서 기록으로 돌아 가면 명령이 계속 표시 $_되지만 while !#:n은 실제 값으로 대체되었습니다. 둘 다 장단점이 있습니다.
Dan

3
또한 평소와 같이 $_인용해야합니다. 그렇지 않으면 다른 모든 것과 마찬가지로 쪼개지고 움켜 잡습니다. (우리 echo는 논란을 하나의 공백으로 결합한 이후 여기에서는 보이지 않습니다 .) 그러나 예를 들어 touch "hello there"; ls -l $_ 작동하지 않습니다.
ilkkachu

1
@ Dan 가장 큰 $_장점은 휴대용이라는 것입니다. 결국 !#:nbash마다 다릅니다.
Sergiy Kolodyazhnyy 2018 년

3

나는 steeldriver 's answer에 주어진 역사 접근법에 반대하는 것이 좋습니다 . 이것은 항상 부서지기 쉬운 전역 상태에 의존합니다.

적절한 변수를 사용하여 필요한 모든 명령을 미리 루프하는 것이 좋습니다.

$ for c in touch gedit; do $c foo.txt; done

일반적으로 약간의 문제는 실패가있을 때 Bash가 중단되지 않는다는 touch foo.txt; gedit foo.txt것입니다 &&. 따라서 안전을 위해 다음을 추가 할 수 있습니다 break.

$ for c in touch gedit; do $c foo.txt || break; done

1

하나의 라이너를 요리 할 때 때로는 반복되는 것을 명령에서 여러 번 사용하는 쉘 변수에 할당합니다. 위쪽 화살표, control + a, control + 오른쪽 화살표가있는 다른 arg를 사용하여 커서를에 가깝게 가져 오도록 호출하고 편집 할 수 있습니다 t=.

t=testloop; asm-link -d "$t.asm" && perf stat -r2 ./"$t"

이렇게하면 확장명이나 이름을 쉽게 변형 할 수 있습니다.

또한 ;변수 할당 후에는 var=value cmd해당 명령의 환경 변수로 설정하고 셸 컨텍스트에 영향을 미치지 않기 때문에 변수 할당 후에 필요합니다 .

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