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


10

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



問題の興味深い解決策を見つけた
ばかり

1
@VarunAgw笑、面白い検索、同じ解決策を考えていたとおり。恥。私は1分間、ユニークな蝶だと思った:(
Gravy

回答:


14

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

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

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

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

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

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

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


代わりに、UIDとGIDを変更するので、私たちはすることができuseradd 'tmp'、次に置き換えるtmp~
VarunAgw

そうだね。良い提案。shadowエントリでそれを正当化することについてどのように感じているのかわかりませんが、パスワードが設定されていない限り、それは実際には追加のリスクではありません。
グレイビー

8

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

からman bash(ただし、CDPATHはでも使用できますsh

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

それを行うことができますcd ~~

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

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

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


1

シェルの~チルダ展開はほとんどプログラム可能です。それは後続のコンテキスト内で宣言システムユーザ名のユーザディレクトリのいずれかに展開(既に提供されており、これらの線に沿って優れた溶液)の値は、$HOMEシェル変数、またはすべてではありませんで。

そう:

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

/tmp
/home/mikeserv

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

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

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


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

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

/tmp/1/2

cdは必ずシェル組み込みですが、POSIXの特別なシェル組み込みではないため、の値を宣言$CDPATHしても、現在のシェル値には影響しません。上記のように使用すると、その値は$CDPATH1つの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

0

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

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

もう少し近づく別のアプローチを次に示します(要件に近づきません)

function ~~ { echo /test; }

次に、さらに2文字追加します。

cd `~~`/subdir
vi `~~`/file

2
まあ、cd ~~/foo/barそんなに上手くいかないのかvim ~~/foo.txt、など…
derobert '29 / 09/15

1
質問は不明確です。それが望ましい使用法でCDPATHあるcd場合は、変数を使用してケースを処理します。
グレン・ジャックマン、2015

完全に明確ではないことに同意しますが、OPはのように動作するように求めます~。また~、コマンドのようには使用されません。
derobert

完全に綴られていないとしても、私はそれをかなり理解できると思いました。問題CDPATHは、CD以外のコマンドでは機能しないことです。IEあなたはできるcd ~~cd ~~/testdir1が、あなたはできませんでしたvim ~~testdir1
グレービー

関数を呼び出すエイリアスの方が良いかもしれません。いいねalias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeserv 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.