~/.bashrc
출력에서 목록을 숨기려면 다음이 있습니다 .test
ls
alias ls='ls -I test'
test
하지만 현재 작업 디렉터리가 루트( /
) 폴더일 때만 숨겨지고 다른 폴더에 있을 때는 숨겨지길 원합니다 .
이 목표를 어떻게 달성할 수 있나요?
답변1
ls () {
case "$PWD" in
/) command ls -I test "$@" ;;
*) command ls "$@" ;;
esac
}
위의 쉘 함수는 현재 디렉토리를 테스트하고 테스트 결과에 따라 다른 방식으로 /
GNU 명령을 실행합니다 .ls
"$@"
원래 명령줄의 명령줄 옵션과 피연산자로 대체됩니다.
쉘 함수 조회를 우회하려면 함수 내에서 command ls
대신 사용해야 합니다 (그렇지 않으면 멋진 무한 재귀가 제공됩니다).ls
ls
이 됩니다.아니요다른 곳에서 수행하는 경우 무시 모드를 사용하십시오 ls /
.~ 할 것이다ls /home/dvoo
예를 들어 다음 부터 실행하는 경우 /
무시 모드가 사용됩니다.
실제로 무엇을 했는지 기억하기 쉽도록 하려면(6개월 후 무엇을 했는지 궁금할 때) 긴 옵션을 사용하세요.
ls () {
case "$PWD" in
/) command ls --ignore='test' "$@" ;;
*) command ls "$@" ;;
esac
}
ls
위 함수의 또 다른 구현은 한 위치 (또는 더 짧은 위치) 에서만 호출됩니다 .
ls () {
[ "$PWD" = "/" ] && set -- --ignore='test' "$@"
command ls "$@"
}
답변2
/
함수를 사용하여 다음 사항에 해당 하는지 테스트하세요 ls
.
ls () {
if [[ "$PWD" == / ]]
then
command ls -I test "$@"
else
command ls "$@"
fi
}
이렇게 하면 전달한 모든 매개변수가 ls
계속 사용됩니다.
또는:
ls () {
if [ "$PWD" == / ]
then
set -- -I test "$@"
fi
command ls "$@"
}
답변3
내 생각에 다음과 같은 것이 효과가 있을 것 같습니다.
alias ls='[[ "$PWD" = "/" ]] && ls -I test ||ls'
$PWD
pwd가 현재 작업 디렉터리인
&&
경우 /
(조건 확인 = true),
||
pwd가 아닌 경우 /
(조건 확인 = false) 작업을 수행합니다.
그러나 신중하게 테스트한 결과 위의 해결 방법은 제대로 작동하지 않습니다.
반면에 이는 함수를 대체하여 사용할 수 있습니다.
alias ls='{ [[ "$PWD" == "/" ]] && a="-I tmp2" ||a=""; };ls $a '
또는 다른 답변과 유사하지만 기능이 없는 것이 더 좋습니다.
alias lstest='{ [[ "$PWD" == "/" ]] && set -- "-I" "tmp2" || set --; }; ls "$@"'
이 별칭이 호출되면 명령줄에 제공된 가능한 추가 플래그 및/또는 전체 경로가 보존되어 ls로 전송됩니다.