代码挑战:Bash 提示路径缩短器

2024-02-10

我为 bash 实现了一个提示路径缩短器,将其包含在 PS1 环境变量中,它将工作目录缩短为更紧凑但仍具有描述性的目录。我很好奇可能存在什么其他想法。

这是挑战:

创建 bash 函数_dir_chomp可以像这样包含到 PS1 中(插入换行符以提高可读性):

PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\] $(
  _dir_chomp "$(pwd)" 20
)\[\033[01;37m\]$(parse_git_branch)\[\033[01;34m\] \$\[\033[00m\] '

其中“20”是作为软限制的最大长度的参数。这些是示例:

  1. /usr/portage/media-plugins/banshee-community-extensions/files变成/u/p/m/b/files
  2. /home/user1/media/video/music/live-sets变成~/m/v/m/live-sets(注意 ~ 字符作为 $HOME 的替换)
  3. /home/user2/media不会改变(未超过 20 个字符的限制)
  4. /home/user1/this-is-a-very-long-path-name-with-more-than-20-chars变成~/this-is-a-very-long-path-name-with-more-than-20-chars(最后一个组件保持不变:软限制)
  5. /home/user1/src变成~/src($HOME 总是缩写)
  6. /home/user1/.kde4/share/config/kresources变成~/.k/s/c/kresources(注意前缀点被保留)

当前用户是user1。

允许调用外部解释器,例如awk, perl, ruby, python但不编译 C 程序或类似程序。换句话说:不允许使用外部源文件,代码必须是内联的。最短的版本获胜。 bash 函数体(并称为子函数)的长度很重要,意味着:

_sub_helper() {
  # this counts
}
_dir_chomp() {
  # these characters count (between { and })
  _sub_helper "foobar" # _sub_helper body counts, too
}

纯狂欢:

_dir_chomp () {
    local IFS=/ c=1 n d
    local p=(${1/#$HOME/\~}) r=${p[*]}
    local s=${#r}
    while ((s>$2&&c<${#p[*]}-1))
    do
        d=${p[c]}
        n=1;[[ $d = .* ]]&&n=2
        ((s-=${#d}-n))
        p[c++]=${d:0:n}
    done
    echo "${p[*]}"
}

出于测试目的,我假设该问题意味着当前用户是“user1”。

注意:Bash 4 有一个变量PROMPT_DIRTRIM这缩短了\w逃入PS1根据其值保留子目录的数量并将其余部分替换为...

/$ PROMPT_DIRTRIM=2
/$ echo $PS1
\w\$
/$ pwd
/
/$ cd /usr/share/doc/bash
.../doc/bash$
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代码挑战:Bash 提示路径缩短器 的相关文章

  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • awk 脚本中出现“BEGIN 块必须有操作部分”错误

    这是我的代码 bin sh filename usr bin find name INSTANCE log echo filename is filename awk BEGIN print Processing file filename
  • 如何使用 docker ENTRYPOINT 与 shell 脚本文件组合参数

    我编写 shell 脚本文件并将其与 docker ENTRYPOINT 一起使用 但是当我运行 docker image 时 由于入口点代码行 它只是停止而没有任何错误日志 我的 Dockerfile FROM ubuntu 16 04
  • 以不敏感的方式在 bash 中查找路径

    假设一条路径像 home albfan Projects InSaNEWEBproJECT 尽管事实上不使用这样的名称 有没有办法以不敏感的方式检查路径 我遇到了这个解决方案 但如果可能的话 我想找到一个内置或 gnu 程序 functio
  • 使用 SIGINT 默认处理程序时从 system() 返回值

    我遇到了一些奇怪的返回值system 当子进程从终端接收到 SIGINT 时 解释一下 从 Perl 脚本parent pl I used system 运行另一个 Perl 脚本作为子进程 但我还需要通过 shell 运行子进程 所以我使
  • 在 Mac OS X 10.6.8 中手动编译 Ruby 时,GEM 在哪里?

    我在 Snow Leopard 上手动构建了 Ruby 1 9 2 现在我找不到我的旧 GEM 文件了 我猜他们现在正走在不同的道路上 所以我有三个问题 什么是 旧 宝石路径 在哪里gem install sinatra把西纳特拉宝石 当我
  • 静默检查 bash 脚本中是否存在 rpm

    我正在尝试使用 if 语句快速检查 rpm 是否安装在 bash 脚本中 但我想默默地做 目前 当我运行脚本并且 rpm 确实存在时 它将 rpm 的输出输出到我不想要的屏幕 if rpm qa grep glib then do some
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 在 bash 脚本中使用源时出现“源:未找到”错误

    我正在尝试编写 我认为的 一个简单的 bash 脚本 它将 运行 virtualenv 以 1 美元创建一个新环境 激活虚拟环境 做更多的事情 安装 django 将 django admin py 添加到 virtualenv 的路径等
  • Python 2.7从非默认目录打开多个文件(对于opencv)

    我在 64 位 win7 上使用 python 2 7 并拥有 opencv 2 4 x 当我写 cv2 imread pic 时 它会在我的默认 python 路径中打开 pic 即C Users Myname 但是我如何设法浏览不同的目
  • Bash 实例未嵌套在 Dockerfile `RUN` 中

    嵌套 bash 实例会递增 SLVL 环境变量 http tldp org LDP abs html internalvariables html http tldp org LDP abs html internalvariables h
  • 检查 Git 中是否需要 pull

    如何检查远程存储库是否已更改并且需要拉取 现在我使用这个简单的脚本 git pull dry run grep q v Already up to date changed 1 但它比较重 有没有更好的办法 理想的解决方案是检查所有远程分支
  • 在 bash 脚本中检测鼠标点击

    我想知道如何在后台运行 bash 脚本 每当用户单击鼠标时该脚本都会执行某些操作 即运行脚本或命令或其他任何内容 即使终端关闭 我也希望它继续运行 有任何想法吗 谢谢 如果您使用的是X11 您可以尝试xdotool捕获鼠标事件 它会是这样的
  • 如何扩展路径中的波形符(~)[重复]

    这个问题在这里已经有答案了 我有一个 shell 脚本 可以从用户那里获取目录路径 但我需要检查目录是否为空 如果用户将他的主路径与 而不是绝对路径 所以我无法检查它ls echo Specify your project root dir
  • Bash 中的动态变量名称

    我对 bash 脚本感到困惑 我有以下代码 function grep search magic way to define magic variable 1 ls tail 1 echo magic variable 1 我希望能够创建一
  • 为什么 Git Bash 无法运行我的可执行文件?

    I am on git for windows https github com git for windows 吉特 巴什 我无法在命令行上运行可执行文件 Pedr Abc 07 MINGW64 c dev ls sqlite3 exe
  • Tensorboard SyntaxError:语法无效

    当我尝试制作张量板时 出现语法错误 尽管开源代码我还是无法理解 我尝试搜索张量板的代码 但不清楚 即使我不擅长Python 我这样写路径C Users jh902 Documents logs因为我正在使用 Windows 10 但我不确定
  • Bash 中单行 while 循环的语法

    我无法找到分号和 或大括号的正确组合 我想这样做 但作为命令行中的一句 while 1 do foo sleep 2 done while true do foo sleep 2 done 顺便说一句 如果您在命令提示符下将其输入为多行 如
  • 如何wget目录中最新的文件

    我想编写一个 bash 脚本来下载并安装最新的每日构建程序 RStudio 是否有可能使wget仅下载目录中最新的文件http www rstudio org download daily desktop http www rstudio
  • 使用awk将列中的值替换为txt文件中的另一个值

    我是 Linux 和 awk 脚本编写的新手 我有 tab delim txt 文件 如下所示 AAA 134 145 Sat 150 167 AAA 156 167 Sat 150 167 AAA 175 187 Sat 150 167

随机推荐

  • 如何使用 Axios NPM 库执行带有 XML SOAP 参数的 GET 请求?

    Axios 允许您使用查询和参数运行 GET 查询 有没有办法将 XML SOAP 参数传递到 Axios 请求中 await Axios get url params xmls Is it this data xmls Is it thi
  • 如何从测试覆盖率中排除 Dagger2 类

    是否有任何选项可以从 Android Studio 的测试覆盖率报告中排除 Dagger2 类 JaCoCo 排除 如果您使用 JaCoCo 例如使用 android 仪器连接测试 您需要配置excludes 或包括 根据文档 http w
  • Meteor:将图像从 url 保存到 AWS S3 存储

    我正在尝试在服务器端通过其网址从网络获取图像 即http www skrenta com images stackoverflow jpg http www skrenta com images stackoverflow jpg 并使用
  • 无法取消对 EJB 的 @Asynchronous 调用

    在这个最简单的例子中我做错了什么 Glassfish 4 0 b87 Eclipse 开普勒 m6 我自己 java package com example cancelbug import java util concurrent Exe
  • Three.js - 对象跟随鼠标位置

    我正在创建一个球体Three js每当鼠标移动时它都必须跟随鼠标 如图所示这个例子 https stemkoski github io Three js Mouse Sprite html 处理鼠标移动的函数如下 function onMo
  • 无法复制到 Windows 10 上的 Windows 容器(“docker cp”)

    我在笔记本电脑上设置了适用于 Windows 的 Docker 然后从Linux容器 to Windows容器在 Docker 的设置中 这会提示几次重新启动和 Windows 更新 我提取了一个图像并使用以下命令运行基于它的容器 dock
  • 在具有不同根相对路径的代理后面运行 ASP.NET MVC 应用程序

    我在代理后面运行的 ASP NET MVC 应用程序中遇到路径问题 我们的 IIS 应用程序根路径是例如http 服务器 MyApp http server MyApp 意味着使用应用程序根目录的所有 url Url Action MyAc
  • 实体框架 - 附加实体 - 附加导航属性?

    我有以下通用代码来更新断开连接的实体 public T UpdateItem T entity this dbSet Attach entity this dbContext Entry entity State System Data E
  • 如何让 Install4j 对所有内容进行签名?

    如何更改 Mac OS X 上 install4j 的协同签名对哪些文件进行签名 具体来说 我的应用程序的所有文件 包括其 jar 文件 都没有经过签名 这完全违背了代码签名的目的 所以 我想解决这个问题 我也想在 Windows 上做同样
  • SymPy 中的非顺序替换

    我正在尝试使用 SymPy 1 同时替换表达式中的多个术语 我尝试使用字典作为参数的 subs 函数 2 但发现它是按顺序替换的 In a subs a b b c Out c 问题是第一次替换产生的术语可以被第二次替换所替换 但它不应该
  • Microsoft.Build.BuildEngine.Engine 在构建 WPF 应用程序时抛出错误

    我正在使用 Microsoft Build BuildEngine Engine 构建 WPF 应用程序 这对于类库和 Web 应用程序来说已经成功运行 但现在尝试使用它来构建 WPF 应用程序时 我收到以下错误 目标标记CompilePa
  • powershell 文件名唯一部分列表

    我有多台机器将文件上传到一个 FTP 目录 文件名的第一部分是机器 其余部分是时间戳 例如AAAAA 20130312 125113 现在我想获取已上传到此目录的所有唯一计算机的排序列表 我设法将丢失的所有 filenames substr
  • 使用 adb 向 Android 手机发出捏合/捏合命令

    到目前为止 我可以使用 adb 命令点击 滑动 解锁 安装 卸载和启动应用程序 但无法找到如何使用 adb 命令执行放大 缩小 我已经获得了捏入 捏出的坐标 但不知道如何使用终端的 adb 命令来触发它们 例如 我们有命令 gt adb s
  • 如何为本地Rails项目设置Postgres数据库?

    我最近买了一台新机器 现在想在 Github 上处理我的项目 我很好奇如何在本地计算机上正确设置 Postgres 数据库 我有postgresql pgadmin3 and libpq dev安装在 Ubuntu 12 04 上 我拉下项
  • 大量 iTunes Connect 抓取

    我正在研究从 iTunes Connect 网站获取销售报告和其他数据的不同选项 由于Apple不提供API 所以我找到的所有解决方案都是基于抓取页面 由于我需要我们提供的产品的信息 因此我不太乐意将所有 iTunes 帐户提供给第三方服务
  • Spring Boot 多个端口?

    如何让 Spring Boot Web 应用程序在多个端口上运行 例如8080和80我怎样才能做到这一点 应用程序属性 server port 8080 80 您可以添加侦听器 而不是运行多个应用程序 例如 如果您使用 undertow C
  • Firebase“抛出新错误('提供的服务帐户无效');”错误信息

    我注意到 Firebase 最近发生了变化 我正在构建一个需要 firebase 的 node js 应用程序 以前这就足够了 var Firebase require firebase var firebaseRef new Fireba
  • 从 create-react-app 公共文件夹读取 JSON 文件 [重复]

    这个问题在这里已经有答案了 我有一个 ipAddress json 文件 其中包含以下内容 ipAddress 11 111 111 111 在公共文件夹中 我将该 ipAddress json 文件放入 ipAddress 文件夹中 因此
  • 按日期对 pandas df 中的组进行排序和排名

    从以下类型的数据框中 我希望能够对id日期字段 df pd DataFrame id 1 1 2 3 3 4 5 6 6 6 7 7 value 01 4 2 3 11 21 4 01 3 5 8 9 date 10 01 2017 15
  • 代码挑战:Bash 提示路径缩短器

    我为 bash 实现了一个提示路径缩短器 将其包含在 PS1 环境变量中 它将工作目录缩短为更紧凑但仍具有描述性的目录 我很好奇可能存在什么其他想法 这是挑战 创建 bash 函数 dir chomp可以像这样包含到 PS1 中 插入换行符