3

私は次のディレクトリ構造を持っています:

misha@misha-lmd:~/tmp$ ls -l
total 4.0K
-rw-r--r-- 1 misha lmd 21 Feb 18 21:00 hello.py
lrwxrwxrwx 1 misha lmd 20 Feb 18 21:01 symlink -> /home/misha/nobackup/

次に、私は次のことを試みます:

misha@misha-lmd:~/tmp$ cd symlink
misha@misha-lmd:~/tmp/symlink$ cat ../hello.py 
cat: ../hello.py: No such file or directory

なぜこれが機能しないのですか?

代わりにこれを行う場合:

misha@misha-lmd:~/tmp/symlink$ cd ..
misha@misha-lmd:~/tmp$ cat hello.py
print "Hello World!"

その後、すべてが順調です。cdは適切に処理しますが、catは処理しません。この魔術とは何ですか、そしてどうすれば私が望むように物事を機能させることができますか?

編集

OK、ここでのいくつかの答えのおかげで、私は何が起こっているのかについてもう少し知りました。まず、cd実際には実行可能ファイルではなく、シェル(この場合はbash)の組み込みコマンドです。

misha@misha-lmd:~/tmp$ type cd
cd is a shell builtin

もしそうならman bash、ディレクトリの移動を含め、bashがハウスキーピングに使用する環境変数に関するすべてを見つけることができます。のような他のビルトインがあり、pwd実際に実行可能ファイルである対応物があります。

misha@misha-lmd:~/tmp/symlink$ type pwd
pwd is a shell builtin
misha@misha-lmd:~/tmp/symlink$ /bin/pwd
/home/misha/nobackup
misha@misha-lmd:~/tmp/symlink$ /bin/pwd -L
/home/misha/tmp/symlink

実行可能ファイルは/bin/pwdデフォルトで物理パスを出力しますが、「-L」スイッチを指定すると論理パスを出力することもできます。同様に、私がやろうとすると:

misha@misha-lmd:~/tmp/symlink$ cat ../hello.py 
cat: ../hello.py: No such file or directory

論理的なディレクトリではなく、物理的な親ディレクトリ..として解釈されているため、問題が発生しています。これにより、質問を次のように絞り込むことができます。

..実行可能ファイルにコマンドライン引数を指定する場合、物理的な親ではなく、論理的な親を意味するようにするにはどうすればよいですか?

4

3 に答える 3

4

シンボリックリンクされたディレクトリ..内のディレクトリがホームディレクトリだからです。

../something..「最後のパスコンポーネントを削除する」ではなく、「ディレクトリに移動する」ことを意味します。

pwd -Pシンボリックリンクに変更した後、自分がどこにいるかを確認することができます。

于 2013-02-18T12:09:07.923 に答える
1

がないので動作しません/home/misha/hello.py。シンボリックリンクは新しいディレクトリを作成しませんが、リンクされたディレクトリを指します。したがって、シンボリックリンクにcdすると、実際にはそのディレクトリにcdします。

シェルがシンボリックリンクから来た場所を覚えていると思いましたか?まあ、そのようには動作しません:)

于 2013-02-18T12:10:17.807 に答える
0

試す

cat $(cd ..; pwd)/hello.pycat

それがあなたを助けるかどうかわからない。

編集:
あなたが本当にそれを必要とするならば、これはそれをする方法です(しかしそれはちょっと醜いです):

$ lcat ( ) ( cd "${1%/*}"; cat "${1##*/}"; )
# use it like 'cat'
$ lcat ../hello.py

関数本体の( ... )代わりにを使用すると、現在のシェルの代わりにサブシェルで実行されます。 試してみると「ファイル名補完」でも動作します。 しかし、これは解決するだけであり、他のコマンドにも使用するのはもっと複雑になる可能性があると思います。{ ... }cd

cat

$ lcmd ( ) ( local cmd="$1"; shift; cd "${1%/*}"; $cmd "${1##*/}"; )

次に、例えばlcmd cat ../hello.py

于 2013-02-18T13:56:25.037 に答える