Buat pintasan lain `~~` seperti `~` (direktori home)


10

Saya ingin ~~menunjuk ke direktori yang berbeda sehingga saya dapat menggunakannya sebagai jalan pintas. Saya ingin memiliki fungsi yang persis sama ~. Bagaimana saya bisa melakukan ini?


2
Anda mungkin lebih baik dengan direktori bernama zsh
Michael Mrozek

Baru saja menemukan solusi yang menarik untuk masalah superuser.com/a/565825/398328
VarunAgw

1
@ VarunAgw haha, Lucu temukan, tepat seperti yang saya pikirkan solusi yang sama. Malu. Saya pikir saya adalah kupu-kupu yang unik selama satu menit :(
Gravy

Jawaban:


14

Sebenarnya, ada cara, ini bukan cara yang hebat, tapi itu jalan, haha!

Tambahkan yang berikut ke /etc/passwdfile Anda :

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

ganti 1111sebagai UID dengan sesuatu yang masuk akal, ganti /testdengan direktori yang Anda inginkan ~~ untuk ditiru.

99pada sistem saya adalah nobodygrup yang saya sarankan jika Anda melakukan ini untuk memastikan itu adalah grup tanpa izin pada file apa pun yang akan pernah digunakan. Secara teoritis dengan /sbin/nologinsebagai shell, seharusnya tidak dapat digunakan, itu juga tidak akan memiliki /etc/shadowentri sehingga tidak akan memiliki kata sandi. Secara teoritis seharusnya baik-baik saja, tetapi pastikan bahwa itu tidak membiarkan Anda masuk sebagai akun.

Sebagai catatan: Saya sama sekali tidak mengatakan ini adalah ide yang baik, tetapi itu akan mencapai fungsi yang Anda inginkan.

EDIT: Demi kelengkapan, ini disarankan oleh VarunAgw: Anda dapat menambahkan pengguna seperti biasa dengan useradd -s /sbin/nologin -N tmpkemudian memodifikasi /etc/passwddan /etc/shadowmengubah pengguna tmpke ~dan mengubah lokasihome directory


Alih-alih mengubah UID dan GID, kita bisa useradd 'tmp'dan kemudian menggantinya tmpdengan~
VarunAgw

Benar. saran yang bagus. Saya tidak yakin bagaimana perasaan saya tentang melegitimasi dengan sebuah shadowentri tetapi saya kira selama tidak ada kata sandi yang ditetapkan, itu bukan risiko tambahan.
Gravy

8

Anda dapat menggunakan CDPATH dan meletakkan direktori yang secara harfiah disebutkan ~~ di salah satu komponen CDPATH Anda.

Dari man bash(tetapi CDPATH tersedia bahkan di sh)

Jalur pencarian untuk perintah cd. Ini adalah daftar direktori yang dipisahkan oleh titik dua di mana shell mencari direktori tujuan yang ditentukan oleh perintah cd. Nilai sampel adalah ".: ~: / Usr".

Itu akan memungkinkan Anda melakukannya cd ~~.

Jika Anda ingin melakukan hal-hal seperti vi ~~/someFiledari mana saja di pohon direktori, maka Anda kurang beruntung jika Anda bersikeras ~~benar kecuali Anda meretas shell Anda, namun, Anda dapat menggunakan variabel atau variabel lingkungan untuk menyimpan direktori sihir Anda sehingga Anda dapat melakukan misalnya$tilda/someFile

Saya biasanya meletakkan file yang sering diakses di dalam direktori yang tidak lama bernama di direktori home saya sehingga saya dapat mengaksesnya dengan path seperti ~/batau ~/l.

Secara alami, Anda biasanya dapat mengganti direktori dengan symlink ke direktori sebanyak yang Anda inginkan.


1

~Ekspansi tilde shell sebagian besar dapat diprogram. Itu diperluas baik ke direktori pengguna dari nama pengguna sistem yang dinyatakan dalam konteks trailing (dan solusi yang sangat baik di sepanjang baris ini telah ditawarkan) , nilai $HOMEvariabel shell, atau tidak sama sekali.

Begitu:

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

/tmp
/home/mikeserv

Saya mengubah $HOMEsemua waktu, dan saya menyimpan fungsi di file lingkungan shell saya untuk mengatur ulang:

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

Jika Anda ingin menggunakan ~tilde dengan cara yang tidak merujuk ke direktori home Anda, maka lakukanlah . Tugaskan kembali $HOME. Jangan takut itu. $HOMEhanyalah variabel shell seperti yang lainnya.


Saran lain yang saya miliki hanyalah sedikit perluasan pada saran bagus dari PSkocik tentang penggunaan $CDPATH. Namun, satu hal yang tidak ia sebutkan adalah Anda dapat menggunakan dan mengubah $CDPATHsebaris tanpa mengubah nilai shell saat ini $CDPATHsama sekali. Sebagai contoh:

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

/tmp/1/2

cdadalah tentu builtin shell, tapi itu bukan POSIX khusus shell builtin, dan menyatakan nilai untuk $CDPATHtidak mempengaruhi nilai shell saat ini. Jika Anda menggunakannya seperti yang saya lakukan $CDPATH, nilai di atas hanya diubah untuk lingkungan dari satu cdperintah, dan dikembalikan ke nilai sebelumnya sesudahnya. Saya cenderung menemukan teknik di atas paling berguna ketika digunakan dalam kombinasi dengan penyelesaian sejarah. Saya akan melakukan hal di atas, ubah ke direktori, jalankan beberapa perintah, lalu tekan hingga saya kembali ke cdperintah saya dan mundur satu atau dua segmen path untuk pindah ke tempat lain.


Sekarang jika Anda menggabungkan kedua konsep ini maka Anda dapat membuat perintah yang sebelumnya digunakan berarti sesuatu yang sama sekali berbeda saat Anda menggunakannya.

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

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

0

Berfungsi dengan sangat baik sebagai fungsi bash:

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

Inilah pendekatan lain yang sedikit lebih dekat (saya tahu saya tidak terlalu dekat dengan persyaratan)

function ~~ { echo /test; }

Kemudian dengan beberapa karakter lagi:

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

2
Ya, cd ~~/foo/bartidak akan bekerja dengan baik, atau vim ~~/foo.txt, dll ...
derobert

1
Pertanyaannya tidak jelas. Jika itu penggunaan yang diinginkan, saya akan menggunakan CDPATHvariabel untuk menangani cdkasus ini.
glenn jackman

Setuju itu tidak sepenuhnya jelas, tetapi OP memang memintanya bekerja seperti ~. Dan ~tidak digunakan seperti perintah.
derobert

Saya menemukan itu cukup dimengerti sendiri, jika tidak sepenuhnya dijabarkan. Masalahnya CDPATHadalah tidak bekerja untuk perintah di luar .... CD. Yaitu Anda bisa cd ~~atau cd ~~/testdir1tetapi Anda tidak bisavim ~~testdir1
Gravy

Anda mungkin melakukan yang lebih baik dengan alias yang memanggil suatu fungsi. sepertialias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '
mikeserv
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.