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?
@ 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.
~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/2done
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 '
Jawaban:
Sebenarnya, ada cara, ini bukan cara yang hebat, tapi itu jalan, haha!
Tambahkan yang berikut ke
/etc/passwd
file Anda :ganti
1111
sebagai UID dengan sesuatu yang masuk akal, ganti/test
dengan direktori yang Anda inginkan ~~ untuk ditiru.99
pada sistem saya adalahnobody
grup 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/nologin
sebagai shell, seharusnya tidak dapat digunakan, itu juga tidak akan memiliki/etc/shadow
entri 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 tmp
kemudian memodifikasi/etc/passwd
dan/etc/shadow
mengubah penggunatmp
ke~
dan mengubah lokasihome directory
sumber
useradd 'tmp'
dan kemudian menggantinyatmp
dengan~
shadow
entri tetapi saya kira selama tidak ada kata sandi yang ditetapkan, itu bukan risiko tambahan.Anda dapat menggunakan CDPATH dan meletakkan direktori yang secara harfiah disebutkan
~~
di salah satu komponen CDPATH Anda.Dari
man bash
(tetapi CDPATH tersedia bahkan dish
)Itu akan memungkinkan Anda melakukannya
cd ~~
.Jika Anda ingin melakukan hal-hal seperti
vi ~~/someFile
dari 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
~/b
atau~/l
.Secara alami, Anda biasanya dapat mengganti direktori dengan symlink ke direktori sebanyak yang Anda inginkan.
sumber
~
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$HOME
variabel shell, atau tidak sama sekali.Begitu:
Saya mengubah
$HOME
semua waktu, dan saya menyimpan fungsi di file lingkungan shell saya untuk mengatur ulang:Jika Anda ingin menggunakan
~
tilde dengan cara yang tidak merujuk ke direktori home Anda, maka lakukanlah . Tugaskan kembali$HOME
. Jangan takut itu.$HOME
hanyalah 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$CDPATH
sebaris tanpa mengubah nilai shell saat ini$CDPATH
sama sekali. Sebagai contoh:cd
adalah tentu builtin shell, tapi itu bukan POSIX khusus shell builtin, dan menyatakan nilai untuk$CDPATH
tidak mempengaruhi nilai shell saat ini. Jika Anda menggunakannya seperti yang saya lakukan$CDPATH
, nilai di atas hanya diubah untuk lingkungan dari satucd
perintah, 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 kecd
perintah 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.
sumber
Berfungsi dengan sangat baik sebagai fungsi bash:
Inilah pendekatan lain yang sedikit lebih dekat (saya tahu saya tidak terlalu dekat dengan persyaratan)
Kemudian dengan beberapa karakter lagi:
sumber
cd ~~/foo/bar
tidak akan bekerja dengan baik, atauvim ~~/foo.txt
, dll ...CDPATH
variabel untuk menanganicd
kasus ini.~
. Dan~
tidak digunakan seperti perintah.CDPATH
adalah tidak bekerja untuk perintah di luar .... CD. Yaitu Anda bisacd ~~
ataucd ~~/testdir1
tetapi Anda tidak bisavim ~~testdir1
alias cd~='HOME=$OTHER_HOME; home(){ cd -- "$1"; HOME=~$USER; unset -f home;}; home '