我BASEDIR=$(pwd)
在脚本中遇到过。
BASEDIR="$PWD"
除了可能$PWD
会被覆盖之外,使用 是否有任何优点或缺点?
pwd
给我
/data/users/me/some/random/folder
Run Code Online (Sandbox Code Playgroud)
有没有简单的获取方式
~/some/random/folder
Run Code Online (Sandbox Code Playgroud)
从pwd
?
例如:
$ ls -aF
./ ../ bin/
$ cd tin # with a tee, not bee
bin
$ pwd
/home/user/bin
Run Code Online (Sandbox Code Playgroud)
换句话说,cd
猜测我真正的意思是cd bin
,并成功(嗯?)相应地更改当前目录。我没有在Bash 参考手册man bash
中找到这种行为的记录。
我希望 Bash 产生一个错误,向标准错误写入一些信息,如果没有找到与参数匹配的目录(考虑扩展) ,则保持当前目录不变。dir
供参考,
$ type cd
cd is a shell builtin
$ ps -p $$
PID TTY TIME CMD
46959 pts/8 00:00:00 bash
$ bash --version
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version …
Run Code Online (Sandbox Code Playgroud) 假设我登录到 unix 系统上的 shell 并开始窃听命令。我最初从用户的主目录开始~
。我可能会从那里cd
到目录Documents
。
这里更改工作目录的命令非常简单直观地理解:父节点有一个它可以访问的子节点列表,并且大概它使用搜索的(优化的)变体来定位子节点的存在输入用户的名称,然后“更改”工作目录以匹配此名称 - 如果我错了,请纠正我。更简单的是,shell 只是“天真地”尝试完全按照用户的意愿尝试访问目录,并且当文件系统返回某种类型的错误时,shell 会相应地显示响应。
然而,我感兴趣的是,当我向上导航一个目录时,相同的过程是如何工作的,即导航到父级或父级的父级。
鉴于我未知的,大概是“盲”位置Documents
,整个文件系统树中可能有许多目录之一具有该名称,Unix 如何确定我接下来应该放置的位置?它是否参考pwd
并检查了它?如果是,如何pwd
跟踪当前导航状态?
为什么当我输入此命令时,提示会更改为我的目录?
PS1='$(pwd)'
Run Code Online (Sandbox Code Playgroud)
我使用的是单引号,这意味着没有插值,也就是echo '$(pwd)'
——?$(pwd)
此外,假设我们澄清了为什么这会起作用……为什么它的功能与PS1=$(pwd)
? (根本没有引号)
不同的是,我的意思是,如果我使用引号,那么当我浏览终端时,提示将不断更改为我的当前目录。但是如果我不使用引号,那么提示将始终保持我第一次输入命令时所在的目录PS1=$(pwd)
为什么?
我添加了一个符号链接到当前目录ln -s . aa
。如果我执行cd aa
,然后我执行pwd
,响应是/home/sim/aa
。
但是如果我执行/bin/pwd
它会打印/home/sim
(当前目录没有改变)。
这种差异从何而来?
在带有 Ubuntu 14.04 和 的系统中bash
,我的PS1
变量以以下内容结尾:
\u@\h:\w\$
Run Code Online (Sandbox Code Playgroud)
以便提示显示为
user@machinename:/home/mydirectory$
Run Code Online (Sandbox Code Playgroud)
然而,有时,当前目录有一个长名称,或者它在长名称的目录中,所以提示看起来像
user@machinename:/home/mydirectory1/second_directory_with_a_too_long_name/my_actual_directory_with_another_long_name$
Run Code Online (Sandbox Code Playgroud)
这将填充终端中的行,光标将转到另一行,这很烦人。
我想获得类似的东西
user@machinename:/home/mydirectory1/...another_long_name$
Run Code Online (Sandbox Code Playgroud)
有没有办法定义PS1
变量来“包装”和“压缩”目录名称,永远不会超过一定数量的字符,从而获得更短的提示?
我正在第一次将用户文件从旧系统移动到新系统。我的目标是使用 SCP,因为它的语法简单scp -r source destination
。我首先尝试使用以下命令来复制文件:
scp -r root@10.0.0.11:/home/someuser/* .
Run Code Online (Sandbox Code Playgroud)
回想起来,根据过去的经验,这复制了所有没有前导.
. 为了解决这个问题,我这样做了:
scp -r root@10.0.0.11:/home/someuser/.* .
Run Code Online (Sandbox Code Playgroud)
表示以 . 开头的任何内容的通配符.
。显然(为什么我问这个问题)它没有达到我想要的效果。观察到的结果是,它将解释为.
在路径中向上移动一个级别,并且它开始复制/home/*
,并且(我认为)将文件放置在我的工作目录之上,而不是工作目录本身。
我对第二个命令执行的解释是否正确?我认为自从我进入以来就很容易修复~/backup
,所以升级了一级~
。我只是rm -rf ~/someuser
在中断命令之前复制的每个用户名。这些someuser
目录应该位于~/backup
从那以后,我学会了如何通过仅指定目录而不是目录中包含的文件来复制我想要的文件。
我打开了两个贝壳。第一个在目录 A 中。在第二个中,我删除目录 A,然后重新创建它。当我回到第一个 shell 并键入 时ls
,输出为:
ls: cannot open directory .: Stale file handle
Run Code Online (Sandbox Code Playgroud)
为什么?我认为第一个 shell(在不存在的目录中保持打开状态的 shell)会在等待下一个命令时“冻结”,并且不会“意识到”该目录已被删除并重新创建。除了字符串之外,shell 是否持有对其当前工作目录的“更深层次”引用$PWD
?
zsh 提供了一些不错的钩子函数,包括chpwd
在用户更改目录后运行函数。
# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd # hi
Run Code Online (Sandbox Code Playgroud)
我正在尝试在 bash 中模拟它。
约束:
$PROMPT_COMMAND
cd
,因为我希望它适用于任何更改目录的命令(例如,pushd
和popd
)trap "my_function" DEBUG
不起作用,除非我能以某种方式在那里说,“首先运行$BASH_COMMAND
我们被困,然后也这样做......”我看到我可以避免启用$BASH_COMMAND
if 的自动运行并且trap 函数返回 1,但我认为我不想强制,并且返回成功(但已修改)的命令似乎是错误的。extdebug
extdebug
1
最后一部分——“按照用户的命令运行”——是目前让我感到困惑的部分。如果我可以在每个命令之后运行一个函数,我可以让它检查自上次检查以来目录是否已更改。例如:
function check_pwd() {
# true in a new shell (empty var) or after cd
if …
Run Code Online (Sandbox Code Playgroud) pwd ×10
bash ×5
directory ×3
filesystems ×2
prompt ×2
cd-command ×1
filenames ×1
home ×1
hook ×1
open-files ×1
path ×1
scp ×1
shell ×1
shell-script ×1
symlink ×1
zsh ×1