可以使用哪些命令来找出正在运行的进程的当前工作目录 (CWD)?这些将是您可以从流程外部使用的命令。
假设我执行以下操作:
cd /some/path
ln -s /target/path symbolic_name
Run Code Online (Sandbox Code Playgroud)
如果那么做:
cd /some/path
cd symbolic_name
pwd
Run Code Online (Sandbox Code Playgroud)
我得到:
/some/path/symblic_name
Run Code Online (Sandbox Code Playgroud)
并不是:
/target/path
Run Code Online (Sandbox Code Playgroud)
有没有办法让shell“完全解析”一个符号链接(即更新CWD等),就好像我已经直接做了:
cd /target/path
Run Code Online (Sandbox Code Playgroud)
?
我需要运行一些似乎“知道”或“敏感”我如何到达目标路径的程序,我希望他们认为我到达目标路径就像cd /target/path直接完成一样。
我们有env(1)来修改我们想要运行的命令的环境(例如env MANPAGER=more man dtrace)。是否有类似的东西,但用于修改命令将在其中启动的目录?
理想情况下,我希望它看起来像这样:
theMagicCommand /new/cwd myProgram
Run Code Online (Sandbox Code Playgroud)
这样,它可以与其他类似 env(1) 的命令“链接”,例如,
daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram
Run Code Online (Sandbox Code Playgroud)
到目前为止,我可以想到以下解决方案,不幸的是它没有与 env(1)相同的接口:
cd /new/cwd && myProgram
Run Code Online (Sandbox Code Playgroud)
另外,我可以像这样创建一个简单的shell脚本:
#! /bin/sh -
cd "${1:?Missing the new working directory}" || exit 1
shift
exec "${@:?Missing the command to run}"
Run Code Online (Sandbox Code Playgroud)
但我正在寻找已经存在的东西(至少在 macOS 和 FreeBSD 上)。
myProgram不一定是桌面应用程序(在这种情况下,我可以只使用.desktop 文件中的Path键)。
我现在在一个路径很长的目录下。为了将来更快地访问它,我想创建一个链接。
我试过
ln -s . ~/mylink
~/mylink实际上链接到~. 那么我可以扩展~到过时的路径名,然后将其提供给ln?
我觉得这应该是直截了当的,但我从未见过有人问过我能说出来的问题。情况非常简单。每当我成为用户时,即su user它总是在 /root 目录而不是主目录中启动。让我演示给你看。
[root@st-test2 ~]# grep "postgres" /etc/passwd
postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql/:/bin/bash
[root@st-test2 ~]# su postgres
bash-4.2$ pwd
/root
[root@st-test2 ~]# ls -lhart /var/lib |grep postgres
drwx------. 4 postgres postgres 86 May 5 16:07 pgsql
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到 postgres 用户的主目录存在并且其设置在 /etc/passwd 中...但出于某种原因,它们从根目录开始。我创建的每个用户都会发生这种情况,我不知道为什么。我也不能说我以前见过这种情况。
Linux 有一个/proc目录和文件系统,据我所知,它不是 POSIX 的一部分。在每个/proc/$PID子目录中,是一个符号链接,cwd指向该PID进程的实际工作目录(该cwd链接始终是最新的)。
这个符号链接对于某些用例很方便,比如使用不同的 shell 和在两个 shell 之间交换文件(正式地,它们的工作目录)。
有没有一种简单的方法来获得类似的东西,只使用 POSIX 功能?
发表评论后,更精确:它不一定是链接和环境变量 lile $<PID>_CWD,也一样好,虽然乍一看,我不相信这样的解决方案存在。它必须易于引用(例如符号链接或环境变量),并且每次其他进程切换其工作目录时始终保持最新。
解决方案不一定是POSIX,最重要的是可移植性,但POSIX肯定是一种保证。
我想创建一个单向符号链接,即我可以使用它转到目标目录,但无法返回。
假设有一个目录,D其中包含两个子目录S1和S2. 我想创建一个链接S1,它指向S2(比方说ls2 -> ../S2/)。如果我这样做cd ls2,然后cd ..然后,我想去D和不S1。
是否可以?
我可以更改某个进程的当前工作目录吗?
例如,我正在运行一个 pid 为 1000 的进程。现在,它的当前工作目录是~. 我想将其当前工作目录更改为~/1. 我该怎么做?
我的 Linux Mint 机器上有一个奇怪的问题(如果有问题,请使用固态驱动器)。不知何故,如果我执行“ls $PWD”而不是“ls” ,机器(在多种情况下)会获得不同的文件和同一文件的不同内容。或只是“ls”。这意味着我可以将文件写入当前工作目录并从另一个目录中选取不同的内容复制它。
这不是 $PWD 设置错误,我可以手动输入目录名称。
我已经非常仔细地检查了这一点,但它确实来来去去。这使得制作和测试生产脚本和代码变得困难。
adam@RADIUM:/home/adam/cd2/adam_dev/rsim ==> ls .
ClearPrice.cme Makefile.win data gfiles rsim5.tmp src zlib
ClearPrice.src ReadMe.txt err include rsimdone.txt tools
Makefile build g2f out scripts vs2013
adam@RADIUM:/home/adam/cd2/adam_dev/rsim ==>
adam@RADIUM:/home/adam/cd2/adam_dev/rsim ==> echo $PWD
/home/adam/cd2/adam_dev/rsim
adam@RADIUM:/home/adam/cd2/adam_dev/rsim ==> ls $PWD
ClearPrice.cmd Makefile.win err include scripts vs2013
ClearPrice.src ReadMe.txt g2f out src zlib Makefile build
gfiles rsimdone.txt tools
adam@RADIUM:/home/adam/cd2/adam_dev/rsim ==>
Run Code Online (Sandbox Code Playgroud) 好的,这是一个简短的问题。我只是碰巧知道使用pushd命令,我们可以将更多工作目录添加到我们的列表中,这很方便。但是有没有办法让这个列表永久化,这样它就可以在重启或注销后继续存在?