GNU/Linux >> Belajar Linux >  >> Linux

Apa yang dapat dilakukan shell dotfile untuk Anda

Jangan tanyakan apa yang dapat Anda lakukan untuk dotfile shell Anda, tetapi apa yang dapat dilakukan shell dotfile untuk Anda!

Saya telah menjelajahi seluruh peta OS, tetapi selama beberapa tahun terakhir driver harian saya adalah Mac. Untuk waktu yang lama, saya menggunakan Bash, tetapi ketika beberapa teman mulai menyebarkan zsh, saya mencobanya. Tidak butuh waktu lama bagi saya untuk menghargainya, dan beberapa tahun kemudian, saya sangat menyukainya untuk banyak hal kecil yang dilakukannya.

Saya telah menggunakan zsh (disediakan melalui Homebrew, bukan sistem yang diinstal), dan peningkatan Oh My Zsh.

Contoh dalam artikel ini adalah untuk .zshrc pribadi saya . Sebagian besar akan bekerja secara langsung di Bash, dan saya tidak percaya bahwa ada yang bergantung pada Oh My Zsh, tetapi jarak tempuh Anda mungkin berbeda. Ada suatu periode ketika saya mempertahankan shell dotfile untuk zsh dan Bash, tetapi saya akhirnya menyerah pada .bashrc saya .

Kami semua gila di sini

Jika Anda ingin kemungkinan menggunakan dotfile yang sama di seluruh OS, Anda harus memberi dotfile Anda sedikit kecerdasan.

### Mac Specifics
if [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac-specific stuff here.
fi

Misalnya, saya berharap tombol Alt + panah untuk memindahkan kursor dengan kata daripada dengan satu spasi. Untuk mewujudkannya di iTerm2 (shell pilihan saya), saya menambahkan cuplikan ini ke bagian khusus Mac dari .zshrc:

saya
### Mac Specifics
if [[ "$OSTYPE" == "darwin"* ]]; then
        ### Mac cursor commands for iTerm2; map ctrl+arrows or alt+arrows to fast-move
        bindkey -e
        bindkey '^[[1;9C' forward-word
        bindkey '^[[1;9D' backward-word
        bindkey '\e\e[D' backward-word
        bindkey '\e\e[C' forward-word
fi

Bagaimana dengan Bob?

Sementara saya mulai menyukai shell dotfile saya, saya tidak selalu menginginkan hal yang sama tersedia di mesin rumah saya seperti di mesin kerja saya. Salah satu cara untuk mengatasi ini adalah memiliki dotfile tambahan untuk digunakan di rumah tetapi tidak di tempat kerja. Inilah cara saya melakukannya:

if [[ `egrep 'dnssuffix1|dnssuffix2' /etc/resolv.conf` ]]; then
        if [ -e $HOME/.work ]
                source $HOME/.work
        else
                echo "This looks like a work machine, but I can't find the ~/.work file"
        fi
fi

Dalam hal ini, saya mematikan sufiks dns pekerjaan saya (atau beberapa sufiks, tergantung pada situasi Anda) dan mencari file terpisah yang membuat hidup saya di tempat kerja sedikit lebih baik.

Hal yang kamu lakukan

Sekarang mungkin saat yang tepat untuk berhenti menggunakan tilde (~ ) untuk mewakili direktori home Anda saat menulis skrip. Anda akan menemukan bahwa ada beberapa konteks yang tidak dikenali. Membiasakan menggunakan variabel lingkungan $HOME akan menghemat banyak waktu pemecahan masalah dan sakit kepala di kemudian hari.

Ekstensi logisnya adalah memiliki dotfile khusus OS untuk disertakan jika Anda menginginkannya.

Memori, sendirian di bawah sinar bulan

Terminal Linux

  • 7 emulator terminal teratas untuk Linux
  • 10 alat baris perintah untuk analisis data di Linux
  • Unduh Sekarang:lembar contekan SSH
  • Lembar contekan perintah Linux tingkat lanjut
  • Tutorial baris perintah Linux

Saya telah menulis shell dalam jumlah yang memalukan, dan saya sampai pada kesimpulan bahwa saya benar-benar tidak ingin menulis lebih banyak. Bukannya shell tidak bisa melakukan apa yang paling saya butuhkan, tetapi saya menemukan bahwa jika saya menulis shell, saya mungkin mencari solusi lakban daripada menyelesaikan masalah secara permanen.

Demikian juga, saya benci menghafal sesuatu, dan sepanjang karir saya, saya harus melakukan perubahan konteks radikal selama sehari. Konsekuensi praktisnya adalah saya harus mempelajari kembali banyak hal beberapa kali selama bertahun-tahun. ("Tunggu... struktur for-loop mana yang digunakan bahasa ini?")

Jadi, sering kali saya memutuskan bahwa saya lelah mencari cara untuk melakukan sesuatu lagi. Salah satu cara saya meningkatkan hidup saya adalah dengan menambahkan alias.

Skenario umum bagi siapa saja yang bekerja dengan sistem adalah mencari tahu apa yang menghabiskan semua disk. Sayangnya, saya tidak pernah bisa mengingat mantra ini, jadi saya membuat alias shell, yang secara kreatif disebut bigdirs :

alias bigdirs='du --max-depth=1 2> /dev/null | sort -n -r | head -n20'

Meskipun saya bisa kurang malas dan benar-benar menghafalnya, yah, itu bukan cara Unix...

Salah ketik, dan orang-orang yang menyukainya

Cara lain menggunakan alias shell meningkatkan hidup saya adalah dengan menyelamatkan saya dari kesalahan ketik. Saya tidak tahu mengapa, tetapi saya telah mengembangkan kebiasaan buruk mengetik w setelah urutan ea , jadi jika saya ingin menghapus terminal saya, saya akan sering mengetik cleawr . Sayangnya, itu tidak berarti apa-apa bagi cangkang saya. Sampai saya menambahkan sepotong kecil emas ini:

alias cleawr='clear'

Dalam satu contoh Windows memiliki perintah yang setara, tetapi lebih baik, saya mendapati diri saya mengetik cls . Sangat frustasi melihat cangkang Anda mengangkat tangannya, jadi saya menambahkan:

alias cls='clear'

Ya, saya mengetahui ctrl + l , tapi saya tidak pernah menggunakannya.

Hibur diri Anda

Pekerjaan bisa membuat stres. Terkadang Anda hanya perlu sedikit bersenang-senang. Jika shell Anda tidak mengetahui perintah yang seharusnya lakukan saja , mungkin Anda ingin mengangkat bahu Anda kembali! Anda dapat melakukan ini dengan fungsi:

shrug() { echo "¯\_(ツ)_/¯"; }

Jika itu tidak berhasil, mungkin Anda perlu membalik meja:

fliptable() { echo "(╯°□°)╯ ┻━┻"; } # Flip a table. Example usage: fsck -y /dev/sdb1 || fliptable

Bayangkan kekecewaan dan kekecewaan saya ketika saya harus membalik meja dan saya tidak dapat mengingat apa yang saya sebut itu. Jadi saya menambahkan beberapa alias shell lagi:

alias flipdesk='fliptable'
alias deskflip='fliptable'
alias tableflip='fliptable'

Dan terkadang Anda perlu merayakannya:

disco() {
        echo "(•_•)"
        echo "<)   )╯"
        echo " /    \ "
        echo ""
        echo "\(•_•)"
        echo " (   (>"
        echo " /    \ "
        echo ""
        echo " (•_•)"
        echo "<)   )>"
        echo " /    \ "
}

Biasanya, saya akan menyalurkan output dari perintah ini ke pbcopy  dan tempel ke alat obrolan relevan yang saya gunakan.

Saya mendapatkan fungsi menyenangkan ini dari akun Twitter yang saya ikuti bernama "Command Line Magic:" @climagic. Karena saya tinggal di Florida sekarang, saya sangat senang bahwa ini adalah satu-satunya salju dalam hidup saya:

snow() {
        clear;while :;do echo $LINES $COLUMNS $(($RANDOM%$COLUMNS));sleep 0.1;done|gawk '{a[$3]=0;for(x in a) {o=a[x];a[x]=a[x]+1;printf "\033[%s;%sH ",o,x;printf "\033[%s;%sH*\033[0;0H",a[x],x;}}'
}

Menyenangkan dengan fungsi

Kami telah melihat beberapa contoh fungsi yang saya gunakan. Karena beberapa contoh ini memerlukan argumen, mereka dapat dilakukan sebagai alias. Saya menggunakan fungsi berdasarkan preferensi pribadi jika lebih dari satu pernyataan singkat.

Di berbagai waktu dalam karier saya, saya telah menjalankan Graphite, solusi metrik deret waktu sumber terbuka, skalabel, dan deret waktu. Ada cukup banyak contoh di mana saya perlu mentranspos jalur metrik (digambarkan dengan titik) ke jalur sistem file (digambarkan dengan garis miring), atau sebaliknya, sehingga menjadi berguna untuk memiliki fungsi khusus untuk tugas-tugas ini:

# Useful for converting between Graphite metrics and file paths
function dottoslash() {
        echo $1 | sed 's/\./\//g'
}
function slashtodot() {
        echo $1 | sed 's/\//\./g'
}

Selama waktu lain dalam karir saya, saya menjalankan banyak Kubernetes. Jika Anda tidak terbiasa menjalankan Kubernetes, Anda perlu menulis banyak YAML. Sayangnya, tidak sulit untuk menulis YAML yang tidak valid. Lebih buruk lagi, Kubernetes tidak memvalidasi YAML sebelum mencoba menerapkannya, jadi Anda tidak akan mengetahui bahwa itu tidak valid sampai Anda menerapkannya. Kecuali Anda memvalidasinya terlebih dahulu:

function yamllint() {
        for i in $(find . -name '*.yml' -o -name '*.yaml'); do echo $i; ruby -e "require 'yaml';YAML.load_file(\"$i\")"; done
}

Karena saya bosan mempermalukan diri sendiri dan kadang-kadang merusak pengaturan pelanggan, saya menulis cuplikan kecil ini dan menambahkannya sebagai pra-komit untuk semua repo saya yang relevan. Hal serupa akan sangat membantu sebagai bagian dari proses integrasi berkelanjutan Anda, terutama jika Anda bekerja sebagai bagian dari tim.

Oh, jari, di mana kamu?

Saya pernah menjadi juru ketik sentuh yang hebat. Hari-hari itu sudah lama berlalu. Saya salah ketik lebih dari yang saya yakini mungkin.

Pada waktu yang berbeda, saya telah menggunakan cukup banyak Chef atau Kubernetes. Untungnya bagi saya, saya tidak pernah menggunakan keduanya secara bersamaan.

Bagian dari ekosistem Chef adalah Test Kitchen, seperangkat alat yang memfasilitasi pengujian, yang dipanggil dengan perintah kitchen test . Kubernetes dikelola dengan alat CLI kubectl . Kedua perintah tersebut memerlukan beberapa sub-perintah, dan keduanya tidak terlalu lancar.

Daripada membuat banyak "alias salah ketik", saya membuat perintah tersebut dengan alias ke k :

alias k='kitchen test $@'

atau

alias k='kubectl $@'

Pembagi waktu

Paruh terakhir karir saya melibatkan menulis lebih banyak kode dengan orang lain. Saya telah bekerja di banyak lingkungan di mana kami telah menyalin salinan repo di akun kami dan menggunakan permintaan tarik sebagai bagian dari proses peninjauan. Ketika saya ingin memastikan bahwa garpu saya dari repo yang diberikan mutakhir dengan induknya, saya menggunakan fetchupstream :

alias fetchupstream='git fetch upstream && git checkout master && git merge upstream/master && git push'

Mataku telah melihat kemuliaan datangnya warna

saya suka warna. Itu bisa membuat hal-hal seperti diff lebih mudah digunakan.

alias diff='colordiff'

Saya pikir halaman manual berwarna adalah trik yang rapi, jadi saya memasukkan fungsi ini:

# Colorized man pages, from:
# http://boredzo.org/blog/archives/2016-08-15/colorized-man-pages-understood-and-customized
man() {
        env \
                LESS_TERMCAP_md=$(printf "\e[1;36m") \
                LESS_TERMCAP_me=$(printf "\e[0m") \
                LESS_TERMCAP_se=$(printf "\e[0m") \
                LESS_TERMCAP_so=$(printf "\e[1;44;33m") \
                LESS_TERMCAP_ue=$(printf "\e[0m") \
                LESS_TERMCAP_us=$(printf "\e[1;32m") \
                man "$@"
}

Saya suka perintah which . Ini hanya memberi tahu Anda dari mana dalam sistem file perintah yang Anda jalankan berasal—kecuali jika itu adalah fungsi shell. Setelah beberapa cascading dotfiles, terkadang tidak jelas di mana suatu fungsi didefinisikan atau apa fungsinya. Ternyata whence dan type perintah dapat membantu dengan itu.

# Where is a function defined?
whichfunc() {
        whence -v $1
        type -a $1
}

Kesimpulan

Saya harap artikel ini membantu dan menginspirasi Anda untuk menemukan cara meningkatkan pengalaman penggunaan shell harian Anda. Mereka tidak perlu besar, baru, atau rumit. Mereka mungkin memecahkan sedikit gesekan tetapi sering, membuat jalan pintas, atau bahkan menawarkan solusi untuk mengurangi kesalahan ketik umum.

Anda dipersilakan untuk melihat-lihat repo dotfiles saya, tetapi saya memperingatkan Anda bahwa itu bisa menggunakan banyak pembersihan. Jangan ragu untuk menggunakan apa pun yang menurut Anda berguna, dan tolong jadilah yang terbaik untuk satu sama lain.


Linux
  1. Sumber Daya Untuk Pemrograman Shell Portabel?

  2. Apakah Anda Membutuhkan Shell Untuk Scp?

  3. Apa yang Dapat Anda Lakukan dengan Cloud VPS 256 MB seharga $0,99?

  1. Apa yang Dapat Anda Lakukan dengan VPS dan Server Cloud?

  2. Apa itu penggunaan () dalam skrip shell?

  3. Bisakah file .sh menjadi malware?

  1. Apa shell favorit Anda untuk pekerjaan sysadmin?

  2. Apa lokasi yang benar untuk variabel PS1 Shell?

  3. Linux - Bagaimana saya bisa melihat apa yang menunggu disk IO