标签: pwd

使用 $(pwd) 还是 $PWD 更好?

BASEDIR=$(pwd)在脚本中遇到过。

BASEDIR="$PWD"除了可能$PWD会被覆盖之外,使用 是否有任何优点或缺点?

shell-script pwd

62
推荐指数
2
解决办法
14万
查看次数

根据“〜”使 pwd 结果?

pwd 给我

/data/users/me/some/random/folder
Run Code Online (Sandbox Code Playgroud)

有没有简单的获取方式

~/some/random/folder
Run Code Online (Sandbox Code Playgroud)

pwd?

filenames home pwd

38
推荐指数
3
解决办法
9649
查看次数

如何让 cd shell-builtin 停止猜测?

例如:

$ 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)

bash directory cd-command shell-builtin pwd

32
推荐指数
1
解决办法
2668
查看次数

Unix 在浏览文件系统时如何跟踪用户的工作目录?

假设我登录到 unix 系统上的 shell 并开始窃听命令。我最初从用户的主目录开始~。我可能会从那里cd到目录Documents

这里更改工作目录的命令非常简单直观地理解:父节点有一个它可以访问的子节点列表,并且大概它使用搜索的(优化的)变体来定位子节点的存在输入用户的名称,然后“更改”工作目录以匹配此名称 - 如果我错了,请纠正我。更简单的是,shell 只是“天真地”尝试完全按照用户的意愿尝试访问目录,并且当文件系统返回某种类型的错误时,shell 会相应地显示响应。

然而,我感兴趣的是,当我向上导航一个目录时,相同的过程是如何工作的,即导航到父级或父级的父级。

鉴于我未知的,大概是“盲”位置Documents,整个文件系统树中可能有许多目录之一具有该名称,Unix 如何确定我接下来应该放置的位置?它是否参考pwd并检查了它?如果是,如何pwd跟踪当前导航状态?

filesystems pwd

29
推荐指数
1
解决办法
3424
查看次数

PS1='$(pwd)' 为什么这有效,为什么这与 PS1=$(pwd) 不同

为什么当我输入此命令时,提示会更改为我的目录?

PS1='$(pwd)'
Run Code Online (Sandbox Code Playgroud)

我使用的是单引号,这意味着没有插值,也就是echo '$(pwd)'——?$(pwd)

此外,假设我们澄清了为什么这会起作用……为什么它的功能与PS1=$(pwd)? (根本没有引号)

不同的是,我的意思是,如果我使用引号,那么当我浏览终端时,提示将不断更改为我的当前目录。但是如果我不使用引号,那么提示将始终保持我第一次输入命令时所在的目录PS1=$(pwd)

为什么?

bash prompt zsh pwd

21
推荐指数
3
解决办法
9118
查看次数

pwd 和 /bin/pwd 之间的奇怪区别

我添加了一个符号链接到当前目录ln -s . aa。如果我执行cd aa,然后我执行pwd,响应是/home/sim/aa

但是如果我执行/bin/pwd它会打印/home/sim(当前目录没有改变)。

这种差异从何而来?

shell symlink pwd

17
推荐指数
2
解决办法
5682
查看次数

使用目录树/文件名时的紧凑 bash 提示

在带有 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变量来“包装”和“压缩”目录名称,永远不会超过一定数量的字符,从而获得更短的提示?

bash prompt directory directory-structure pwd

17
推荐指数
2
解决办法
3171
查看次数

为什么“scp 10.0.0.11:/home/someuser/.*”也开始从/home复制?

我正在第一次将用户文件从旧系统移动到新系统。我的目标是使用 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

从那以后,我学会了如何通过仅指定目录而不是目录中包含的文件来复制我想要的文件。

scp directory path pwd

15
推荐指数
1
解决办法
2704
查看次数

删除目录时出现`ls`错误

我打开了两个贝壳。第一个在目录 A 中。在第二个中,我删除目录 A,然后重新创建它。当我回到第一个 shell 并键入 时ls,输出为:

ls: cannot open directory .: Stale file handle
Run Code Online (Sandbox Code Playgroud)

为什么?我认为第一个 shell(在不存在的目录中保持打开状态的 shell)会在等待下一个命令时“冻结”,并且不会“意识到”该目录已被删除并重新创建。除了字符串之外,shell 是否持有对其当前工作目录的“更深层次”引用$PWD

filesystems bash open-files pwd

13
推荐指数
3
解决办法
2098
查看次数

在 $PWD 发生任何更改后,如何在 bash 中运行命令?

zsh 提供了一些不错的钩子函数,包括chpwd在用户更改目录后运行函数。

# zsh only
function greet() { echo 'hi'; }
chpwd_functions+=("greet")
cd .. # hi
pushd # hi
popd  # hi
Run Code Online (Sandbox Code Playgroud)

我正在尝试在 bash 中模拟它。

约束:

  • 它必须在交互式和非交互式 shell 中都可以工作,我认为这意味着它不能依赖于类似的东西 $PROMPT_COMMAND
  • 它不能重新定义cd,因为我希望它适用于任何更改目录的命令(例如,pushdpopd
  • 它必须用户的命令之后运行,所以trap "my_function" DEBUG不起作用,除非我能以某种方式在那里说,“首先运行$BASH_COMMAND我们被困,然后也这样做......”我看到我可以避免启用$BASH_COMMAND if 的自动运行并且trap 函数返回 1,但我认为我不想强制,并且返回成功(但已修改)的命令似乎是错误的。extdebugextdebug1

最后一部分——“按照用户的命令运行”——是目前让我感到困惑的部分。如果我可以在每个命令之后运行一个函数,我可以让它检查自上次检查以来目录是否已更改。例如:

function check_pwd() {
  # true in a new shell (empty var) or after cd
  if …
Run Code Online (Sandbox Code Playgroud)

bash hook pwd

12
推荐指数
1
解决办法
1675
查看次数