编辑
2025-01-22
记录知识
0
请注意,本文编写于 156 天前,最后修改于 59 天前,其中某些信息可能已经过时。

目录

一、基于栈
二、pushd/popd
三、自定义脚本使用指南
3.1 将文件夹压入栈
3.2 将文件夹推出栈
3.3 查看目录栈的内容
3.3 在栈中选择某个目录
p 3
3.4 清空栈目录
四、脚本源码

最近在开发Openharmony系统,因为Openharmony涉及的目录特别多,而且需要来回的切换,常用的cd和cd -已经不满足基本的开发环境要求了,于是借鉴了栈的思想,写了一个脚本,能够提高大家的开发效率

一、基于栈

我们知道栈的结构是先进后出,也就意味着越新的元素我们就越经常使用。这个概念恰好契合了我们在cd目录的场景上。所以我们切换目录如果是栈的形式保存了目录结构,这样就非常方便我们开发了。基于此思想,我开始了此工具的开发

二、pushd/popd

我们知道,linux有几个基本的命令叫做pushd和popd,这是以栈的思想打开文件目录。但是pushd和popd要经常配合dirs来运行,所以不是很方便,原因如下:

  1. 切换目录要敲很多字,
  2. 没有很好的提示告诉我们应该按照需要几来取出目录
  3. 取出元素需要+符号,打字不方便

pushd和popd以及dir的常用命令如下

pushd /tmp popd dirs pushd +1

三、自定义脚本使用指南

基于上述现状上,我没办法直接使用popd和pushd命令,所以我自己编写了一个较为易用的脚本,使用方法如下:

将脚本命名为p,放入/usr/local/bin/下,赋予执行权限,并在环境中设置如下:

alias p='source p'

3.1 将文件夹压入栈

p dir

例如:

# p /root/ [0]:~ [1]:~/tf/repo/rk3568/vendor/hihope/rk3568/hdf_config/khdf/hdf_test [2]:

3.2 将文件夹推出栈

p

例如:

root@chroot:~# p root@chroot:~/tf/repo/rk3568/vendor/hihope/rk3568/hdf_config/khdf/hdf_test#

3.3 查看目录栈的内容

p -h

例如

root@chroot:/sys# p -h [0]:/sys [1]:/tmp [2]:/root [3]:/root/tf/repo/rk3568/vendor/hihope/rk3568/hdf_config/khdf/hdf_test

3.3 在栈中选择某个目录

p 3

这里选择序号为3的目录栈进行推出

p 3

[0]:~/tf/repo/rk3568/vendor/hihope/rk3568/hdf_config/khdf/hdf_test [1]:/sys [2]:/tmp

3.4 清空栈目录

p -c

这样目录栈就没有其他文件夹了

四、脚本源码

#!/bin/bash dir=$1 BLK='\033[0;30m' # Black RED='\033[0;31m' # Red GRN='\033[0;32m' # Green BLU='\033[0;34m' # Blue CYA='\033[0;36m' # Cyan WHI='\033[0;37m' # White YEL='\033[0;33m' # Yellow PUR='\033[0;35m' # Purple NC='\033[0m' # No Color function fault_log() { echo -e "${RED}$1${NC}" } function info_log() { echo -e "${GRN}$1${NC}" } function dir_list() { array=() dir_name=$(dirs -l) dir_num=$(echo ${dir_name}| awk '{print NF}') i=0 for name in ${dir_name} do array[i]=$name let i=i+1 done output_message="" for i in ${!array[@]} do info_log "${RED}[${i}]${GRN}:${array[i]}" done } function help() { array=() dir_name=$(dirs) dir_num=$(echo ${dir_name}| awk '{print NF}') i=0 for name in ${dir_name} do array[i]=$name let i=i+1 done output_message="" #for i in ${!array[@]} for((i=0;i<3;i++)) do output_message="${output_message}${RED}[${i}]${GRN}:${array[i]} " done info_log "${output_message}" } function push_dir() { if [[ "$1" =~ "+" ]] then num=$(dirs -l | xargs | tr ' ' '\n' | wc -l) if [ ${num} == 1 ] then fault_log "pushd: 目录栈为空" return fi fi pushd $1 > /dev/null if [ $? -ne 0 ] then fault_log "pushd error" fi help } function pop_dir() { popd > /dev/null 2>&1 if [ $? == 1 ] then fault_log "popd: 目录栈为空" fi } case "${dir}" in "") pop_dir ;; "-h") dir_list ;; "-c") dirs -c ;; [0-9]) [ -d ${dir} ] && info_log "存在数字命名的文件夹" [ -d ${dir} ] && push_dir ${dir} [ ! -d ${dir} ] && push_dir "+${dir}" ;; *) [ ! -d ${dir} ] && info_log "没有这样的目录" [ -d ${dir} ] && push_dir ${dir} ;; esac