web-dev-qa-db-ja.com

`〜`(ホームディレクトリ)のような別のショートカット `~~`を作成します

~~が別のディレクトリを指すようにして、ショートカットとして使用できるようにします。 ~とまったく同じ機能を持たせたい。これどうやってするの?

10
VarunAgw

実際、方法はありますが、それは素晴らしい方法ではありませんが、方法です。

以下を/etc/passwdファイルに追加します。

~:x:1111:99:special Character user:/test:/sbin/nologin

1111をUIDとして意味のあるものに置き換え、/testを~~に模倣したいディレクトリに置き換えます。

私のシステムの99nobodyグループです。これを行う場合は、使用されるファイルに対する権限のないグループであることを確認する場合にお勧めします。理論的には、シェルとして/sbin/nologinを使用すると、使用できないはずです。また、/etc/shadowエントリがないため、パスワードがありません。理論的には問題ありませんが、アカウントとしてログインできないようにしてください。

余談ですが、これは良いアイデアだとは決して言いませんが、必要な機能を実現します。

編集:完全を期すために、これはVarunAgwによって提案されました:useradd -s /sbin/nologin -N tmpを使用して通常どおりユーザーを追加し、次に/etc/passwdおよび/etc/shadowを変更してユーザーをtmpから~に変更できます。 home directoryの場所を変更します

14
Gravy

CDPATHを使用して、文字通り~~という名前のディレクトリをCDPATHコンポーネントの1つに置くことができます。

man bashから(ただし、CDPATHはshでも利用可能です)

Cdコマンドの検索パス。これは、コロンで区切られたディレクトリのリストで、シェルはcdコマンドで指定された宛先ディレクトリを検索します。サンプル値は「。:〜:/ usr」です。

これにより、cd ~~を実行できるようになります。

vi ~~/someFileのようなことをディレクトリツリーのどこからでも実行したい場合は、シェルをハックしない限り、文字どおり~~を要求しても運が悪いですが、変数や環境を使用できます。あなたができるようにあなたの魔法のディレクトリを保存する変数、例えば、$tilda/someFile

私は通常、頻繁にアクセスするファイルをホームディレクトリの短い名前のディレクトリ内に配置して、~/b~/lなどのパスでアクセスできるようにします。

当然のことながら、通常はディレクトリをディレクトリへのシンボリックリンクに置き換えることができます。

8
PSkocik

シェルの~チルダ展開はほとんどプログラム可能です。これは、後続のコンテキストで宣言されたシステムユーザー名のユーザーディレクトリに展開されます(そしてこれらの行に沿った優れたソリューションがすでに提供されています)$HOMEシェル変数の値、- orまったくありません。

そう:

(HOME=/tmp; cd ~)
pwd; echo "$HOME"

/tmp
/home/mikeserv

私は常に$HOMEを変更し、それをリセットするためにシェルの環境ファイルに関数を保持しています。

home(){
    HOME=~$USER
    cd ~; pwd
}

ホームディレクトリを参照しない何らかの方法で~チルダを使用する場合は、そうするを使用します。 $HOMEを再割り当てするだけです。それを恐れないでください。 $HOMEは、他のシェル変数と同様に単なるシェル変数です。


私が持っている別の提案は、$CDPATHの使用に関する@PSkocikの優れたアドバイスのほんの少しの拡張です。ただし、彼が言及しなかったことの1つは、$CDPATHの現在のシェル値をまったく変更せずに$CDPATHをインラインで使用および変更できることです。例えば:

mkdir -p /tmp/1/2
CDPATH=/tmp cd 1/2

/tmp/1/2

cdは必ずしもShellビルトインですが、POSIXではありませんspecial Shellビルトインなので、$CDPATHの値を宣言しても、現在のShell値には影響しません。上記のように使用すると、$CDPATHの値は、1つのcdコマンドの環境でのみ変更され、後で以前の値に復元されます。履歴補完と組み合わせて使用​​すると、上記の手法が最も役立つと思います。上記のことを行い、ディレクトリに移動し、いくつかのコマンドを実行し、cdコマンドに戻るまで上に押して、パスセグメントを1つまたは2つバックスペースし、別の場所に移動します。


これら2つの概念を組み合わせると、以前に使用したコマンドを、次に使用するときにまったく異なるものにすることができます。

for HOME in /tmp ~
do  mkdir -p ~/1/2
    CDPATH=~ cd 1/2
done

/tmp/1/2
/home/mikeserv/1/2
1
mikeserv

Bash関数として完全に機能します。

$ function ~~ { cd /tmp; }
$ pwd
/home/jackman
$ ~~
$ pwd
/tmp
$ cd -
$ pwd
/home/jackman

これがもう少し近づく別のアプローチです(要件に近づきません)

function ~~ { echo /test; }

次に、さらにいくつかの文字を追加します。

cd `~~`/subdir
vi `~~`/file
0
glenn jackman