[ -f /root/.bash_aliases ] || echo "$_"
나에게주세요]
제 생각에는/root/.bash_aliases
나도 시도했다
[ -f /root/.bash_aliases ] || echo !:2
하지만 그것은 나에게 다음과 같은 결과를 제공합니다
[ -f /root/.bash_aliases ] || echo /root/.bash_aliases
/root/.bash_aliases
나는 그저 원할 뿐이야/root/.bash_aliases
답변1
이 기능의 목적은 다음과 같습니다.
print_if_not_regular() {
[ -f "$1" ] || printf '%s\n' "$1"
}
print_if_not_regular /root/.bash_aliases
일부 쉘에는 익명 기능이 있거나 다음과 같은 기능이 있습니다 es
.zsh
(){[ -f "$1" ] || printf '%s\n' $1} /root/.bash_aliases # zsh
@ {[ -f $1 ] || printf '%s\n' $1} /root/.bash_aliases # es
$_
예를 들어 DEBUG 트랩이 있으면 더 이상 작동하지 않습니다 .
$ bash -c 'trap ": \"\$((cmdcount+=1))\"" DEBUG; echo foo; echo "$_"'
foo
2
이는 !:n
마지막 명령의 n번째 인수가 아니라 이전 명령줄의 n번째 어휘 토큰 입니다 (기록의 마지막 줄(및 여러 줄)에 저장됨). 예를 들어,
echo $(echo A B)
echo foo; echo !:1
(마지막 명령의 마지막 인수)나 ( 이전 명령줄에 있는 명령의 마지막 인수) !:1
로 확장되지 않고 대신에 확장 됩니다 . 여기에 다음을 입력해야 합니다:foo
B
echo
echo
$(echo A B)
[ -f /root/.bash_aliases ] ||
echo !:2
즉, 별도의 줄에 입력합니다. 여기서는 두 번째 줄을 입력할 때 기록 줄이 완전히 끝나지 않은 경우에도 (우연히) 작동합니다. 동일한 트릭이 (t)csh
(역사적 확장의 소스)에서는 작동하지 않으며 작동하지 않습니다 zsh
.
답변2
사용
test -f /root/.bash_aliases || echo "$_"
또는
test -f /root/.bash_aliases || printf '%s\n' "$_"
$_
이전 명령의 마지막 인수로 확장됩니다. 귀하의 예에서 이전 명령은 [
이고 마지막 인수는 입니다 ]
.
위의 마지막 명령은 test
마지막 매개변수가 파일 이름이라는 것입니다.
test
및 [
동일한 명령이지만 마지막 명령줄 인수로 [
a가 필요합니다 . ]
이 경우 $_
파일 이름을 얻는 데 사용하기가 어려운 이유입니다.
위의 솔루션은 적어도 bash
( DEBUG
트랩을 설정하지 않는 한) 및 에서 작업할 수 있다는 장점이 있습니다 zsh
.
파일 이름이 변수에 있으면 간단합니다.
[ -f "$name" ] || printf '%s\n' "$name"
또는
if [ ! -f "$name" ]; then
printf '%s\n' "$name"
fi
if
명령문 및 단락 논리 테스트에 대한 선호도 에 따라 다릅니다 .