출력은 jobs
다음과 같습니다
[1] Stopped TERM=xterm-256color vim --servername vim ~/.gitconfig
[2]- Stopped TERM=xterm-256color vim --servername vim ~/.vimrc (wd: ~)
[3]+ Stopped TERM=xterm-256color vim --servername vim i3blocks.conf (wd: ~/.config/i3/configs)
섹션(있는 경우)이 표시되는 위치(wd: path)
path
해당 작업이 실행되는 디렉터리입니다.
나는 그 디렉토리로 이동하여 그 직업 중 하나를 수행하는 것에 대해 여러 번 생각했습니다.
이 작업을 수행하는 유틸리티가 있나요?
답변1
에서는 연관 배열 zsh
이 $jobdirs
작업 번호를 해당 작업이 시작된 작업 디렉토리에 매핑하므로 작업 n의 디렉토리 cd $jobdirs[n]
로 이동할 수 있습니다(또는 작업이 존재하지 않는 경우 집으로 돌아가는 대신 오류가 발생함).cd
cd ${jobdirs[n]?}
~$ jobs -d
[1] - running sleep 1000
(pwd : /tmp)
[2] + suspended sleep 123123
(pwd : /usr/local)
~$ cd $jobdirs[2]
/usr/local$
또한 각 작업의 상태 및 코드에 대한 연관 배열을 참조 $jobstates
하세요 .$jobtexts
에서 bash
유일한 옵션은 작업의 출력을 구문 분석하는 것인데, 이는 불행하게도 경험적 방법을 통해서만 수행할 수 있습니다. 예를 들어 다음을 참조하세요.
bash-5.1$ mkdir ') (wd: blah blah)
[5] (wd: blah blih)
'
bash-5.1$ cd ') (wd: blah blah)
[5] (wd: blah blih)
'
bash-5.1$ sh -c 'sleep inf' '(wd: /etc)
[2] (wd: bloh bloh)
'
^Z
[1]+ Stopped sh -c 'sleep inf' '(wd: /etc)
[2] (wd: bloh bloh)
'
bash-5.1$ jobs 1
[1]+ Stopped sh -c 'sleep inf' '(wd: /etc)
[2] (wd: bloh bloh)
'
bash-5.1$ cd /
bash-5.1$ jobs 1
[1]+ Stopped sh -c 'sleep inf' '(wd: /etc)
[2] (wd: bloh bloh)
' (wd: ~/1/) (wd: blah blah)
[5] (wd: blah blih)
)
(wd:...)
작업 디렉터리가 현재 작업 디렉터리가 아닌 경우에만 인쇄된다는 점과 작업의 명령줄이나 작업 디렉터리에 s가 포함된 경우 어느 s가 실제 작업 디렉터리의 시작인지 (wd: ...)
알 수 있는 방법이 없다는 것을 알 수 있습니다 .(wd:
또한 홈 디렉토리를 ~
.
또한 wd:
현지화되어 있습니다. 예를 들어 우크라이나어에서는 다음과 같습니다.
bash-5.1$ LC_ALL=uk_UA.utf8 jobs 1
[1]+ Зупинено sh -c 'sleep inf' '(wd: /etc)
[2] (wd: bloh bloh)
' (РД: ~/1/) (wd: blah blah)
[5] (wd: blah blih)
)
jobs
따라서 예상하는 해당 로케일에서 호출 해야 합니다 .작업 목록약어.
당신이 할 수 있는 일은 경험적 방법을 사용하고 최선을 다하는 것뿐입니다.
cdj() {
local dir
dir=$(LC_ALL=C jobs -- "$1") || return
case $dir in
(*'(wd:'*')')
dir=${dir%')'}
dir=${dir##*'(wd: '}
case $dir in
('~'*) dir=$HOME${dir#'~'}
esac
printf >&2 '%s\n' "Job $1's dir is likely \"$dir\""
cd -- "$dir";;
(*)
printf >&2 '%s\n' "Job $1's dir is likely the current directory already"
esac
}
위에서 디자인한 예제에서는 실패했지만 대부분의 일반적인 상황에서는 작동합니다.
답변2
이제 내에서 다음 함수를 정의하는 문제를 해결했습니다 ~/.bashrc
.
cdj () {
jobNumber="$1"
dir="$(jobs | grep "^\[$jobNumber\]" | sed 's/.*(wd: \(.*\))/\1/;t;d')"
[[ -n "$dir" ]] && eval "cd $dir"
}
이렇게 하면 존재하지 않는 작업이나 현재 디렉터리에서 실행되는 작업 수를 전달하는 경우 이 작업을 수행하고 (의도적으로) 실패할 수 있습니다.cd job-number