우분투 터미널에서 다음과 같이 연쇄 조치를 취할 수 있는지 궁금합니다.
action 1 on objectA . then action 2 on objectA
더 이상 objectA의 이름을 반복하지 않아도됩니다.
예:
touch file.js && openEditor "$1"
또는 그런 것.
&
에서 "touch"명령을 백그라운드로 보냅니다. "터치 성공시 편집기 열기"를 원한다면, &&
대신
우분투 터미널에서 다음과 같이 연쇄 조치를 취할 수 있는지 궁금합니다.
action 1 on objectA . then action 2 on objectA
더 이상 objectA의 이름을 반복하지 않아도됩니다.
예:
touch file.js && openEditor "$1"
또는 그런 것.
&
에서 "touch"명령을 백그라운드로 보냅니다. "터치 성공시 편집기 열기"를 원한다면, &&
대신
답변:
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
GNU bash, version 4.3.48(1)-release
touch foo bar && ls -l !#:1-2
!
캐릭터 는 대화 형 쉘에 있을 때 히스토리 확장 표현을 소개합니다. 입력 할 때 즉시 명령 줄 조작을위한 것이며 비 대화식 스크립트에서는 비활성화되어 있습니다.
arg1=file.js; touch "$arg1" && openEditor "$arg1"
일반적인 사용 사례에 대한 편리한 바로 가기가 있습니다. 귀하의 예에서 당신은하고 있습니다 :
$ touch file.js
$ openEditor <alt>+<.>
두 번째 명령에서 트릭은 openEditor
(공백 뒤에 공백을 두어) 뒤에 Alt+ 를 쓰는 것 .입니다. 마지막 명령 의 마지막 인수 인 을 삽입합니다 . ( 어떤 이유로 작동하지 않으면 작동 해야합니다.)file.js
AltEsc
종종 "개체"는 실제로 이전 명령의 마지막 인수이므로 자주 사용할 수 있습니다. 기억하기 쉽고 직관적으로 사용되는 쉘 단축키 세트에 빠르게 통합됩니다.
이 작업으로 할 수있는 일이 많이 있습니다. 여기에 대한 자세한 내용은 /programming/4009412/how-to-use-arguments-from-previous-command 입니다.
보너스로 이것은 bash뿐만 아니라 명령 줄 입력을 처리하기 위해 libreadline을 사용하는 모든 프로그램에서 작동합니다.
echo 1 2 3 4
한 후 내가 원하는 2
및 3
다음 명령
Alt
and type 2.
, 스페이스 바를 누르고 hold Alt
and type 3.
– 범위를 원하면 히스토리 확장을 사용하십시오 !!:2-3
.
기본 대화식 쉘 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
$_
약간 다르게 작동 한다는 것을 지적하고 싶습니다 !#:n
. 따라서 기록으로 돌아 가면 명령이 계속 표시 $_
되지만 while !#:n
은 실제 값으로 대체되었습니다. 둘 다 장단점이 있습니다.
$_
인용해야합니다. 그렇지 않으면 다른 모든 것과 마찬가지로 쪼개지고 움켜 잡습니다. (우리 echo
는 논란을 하나의 공백으로 결합한 이후 여기에서는 보이지 않습니다 .) 그러나 예를 들어 touch "hello there"; ls -l $_
작동하지 않습니다.
$_
장점은 휴대용이라는 것입니다. 결국 !#:n
bash마다 다릅니다.
나는 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
하나의 라이너를 요리 할 때 때로는 반복되는 것을 명령에서 여러 번 사용하는 쉘 변수에 할당합니다. 위쪽 화살표, control + a, control + 오른쪽 화살표가있는 다른 arg를 사용하여 커서를에 가깝게 가져 오도록 호출하고 편집 할 수 있습니다 t=
.
t=testloop; asm-link -d "$t.asm" && perf stat -r2 ./"$t"
이렇게하면 확장명이나 이름을 쉽게 변형 할 수 있습니다.
또한 ;
변수 할당 후에는 var=value cmd
해당 명령의 환경 변수로 설정하고 셸 컨텍스트에 영향을 미치지 않기 때문에 변수 할당 후에 필요합니다 .