1

我有一个 shell,我使用 pwd 来显示我在哪个目录中。但是当我在它是符号链接的目录中时,它显示物理目录而不是符号链接

import subprocess as sub

def execv(command, path):
    p = sub.Popen(['/bin/bash', '-c', command],
                    stdout=sub.PIPE, stderr=sub.STDOUT, cwd=path)
    return p.stdout.read()[:-1]

如果我有文件夹,它是我打电话时/home/foo/mime的符号链接/usr/share/mime

execv('pwd', '/home/foo/mime')

我有 /usr/share/mime

我的 shell 代码如下所示:

    m = re.match(" *cd (.*)", form['command'])
    if m:
        path = m.group(1)
        if path[0] != '/':
            path = "%s/%s" % (form['path'], path)
        if os.path.exists(path):
            stdout.write(execv("pwd", path))
        else:
            stdout.write("false")
    else:
        try:
            stdout.write(execv(form['command'], form['path']))
        except OSError, e:
            stdout.write(e.args[1])

我有 JavaScript 客户端

(可能以 JSON 格式返回命令和新路径的结果会更好)。

有没有办法让pwd返回路径到符号链接而不是物理目录。

4

3 回答 3

6

只有当前的 shell 知道它正在使用符号链接来访问当前目录。此信息通常不会传递给子进程,因此它们仅通过其真实路径知道当前目录。

如果您希望子流程知道此信息,则需要定义一种传递它的方法,例如通过参数或环境变量。从 shell 中导出 PWD 可能会起作用。

于 2012-06-15T10:19:21.520 回答
3

如果你想解析符号链接,你可能想使用pwd -P,下面是 ZSH 和 BASH 的示例(行为相同)。

ls -l /home/tom/music
lrwxr-xr-x  1 tom  tom  14  3 říj  2011 /home/tom/music -> /mnt/ftp/music

cd /home/tom/music

tom@hal3000 ~/music % pwd
/home/tom/music
tom@hal3000 ~/music % pwd -P
/mnt/ftp/music

使用 FreeBSD 的 /bin/pwd 我得到了这个:

tom@hal3000 ~/music % /bin/pwd 
/mnt/ftp/music
tom@hal3000 ~/music % /bin/pwd -P
/mnt/ftp/music
tom@hal3000 ~/music % /bin/pwd -L
/home/tom/music

因此,如果您希望符号链接未解析,也许您的 pwd(1) 也支持 -L ,因为此版本默认假定为 -P ?

于 2012-06-15T09:38:00.317 回答
3

用于:shell=True_Popen

import os
from subprocess import Popen, PIPE

def shell_command(command, path, stdout = PIPE, stderr = PIPE):
  proc = Popen(command, stdout = stdout, stderr = stderr, shell = True, cwd = path)
  return proc.communicate() # returns (stdout output, stderr output)

print "Shell pwd:", shell_command("pwd", "/home/foo/mime")[0]

os.chdir("/home/foo/mime")
print "Python os.cwd:", os.getcwd()

这输出:

Shell pwd: /home/foo/mime
Python os.cwd: /usr/share/mime

pwdAFAIK,除了像上面那样实际询问外壳本身之外,没有办法在 python 中获取外壳。

于 2013-03-11T16:27:35.320 回答