Bash
有沒有一種方法可以快速將 dir 更改為其中一個作業正在執行的位置?
的輸出
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
有幾次我想搬到那個目錄來做一份工作。
有這樣做的實用程序嗎?
在
zsh
中,$jobdirs
關聯數組將作業編號映射到它們開始的工作目錄,因此您可以將cd $jobdirs[n]
tocd
放入作業 n 的目錄(或者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:...)
僅當作業的 dir 不是目前工作目錄時才會列印,並且如果作業的命令行或工作目錄恰好包含(wd: ...)
,則無法判斷哪個(wd:
s 是實際工作目錄的開始。還將您的主目錄替換為
~
.還要注意
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 }
在我們上面的人為範例中失敗了,但在大多數正常情況下應該可以工作。