ناطق ما هي خادعة سطر الأوامر المفضلة الأكثر استخدامًا باستخدام Bash؟




قاموس عربي انجليزي (24)

أستخدم ما يلي كثيرًا:

في :p معدل لطباعة نتيجة التاريخ. على سبيل المثال

!!:p

سيتم طباعة الأمر الأخير حتى تتمكن من التحقق من أنه صحيح قبل تشغيله مرة أخرى. فقط أدخل !! لتنفيذه.

في نفس السياق:

!?foo?:p

سيتم البحث في السجل الخاص بك عن أحدث الأوامر التي تحتوي على السلسلة "foo" وطباعتها.

إذا لم تكن بحاجة إلى الطباعة ،

!?foo

يفعل البحث وينفذها على الفور.

نعرف جميعًا كيفية استخدام <ctrl>-R لعكس البحث عبر المحفوظات ، ولكن هل تعلم أنه يمكنك استخدام <ctrl>-S لإعادة توجيه البحث إذا قمت بتعيين stty stop "" ؟ وأيضًا ، هل حاولت تشغيل ربط - p لمشاهدة جميع اختصارات لوحة المفاتيح المدرجة؟ يوجد أكثر من 455 على نظام التشغيل Mac OS X افتراضيًا.

ما هي خدعةك المفضلة الوحيدة المفضلة أو اختصار لوحة المفاتيح أو تهيئة العرض باستخدام bash؟


وإليك اثنين من إعدادات التكوين:

~/.inputrc :

"\C-[[A": history-search-backward
"\C-[[B": history-search-forward

هذا يعمل بنفس ^R ولكن باستخدام مفاتيح الأسهم بدلاً من ذلك. هذا يعني أنه بإمكاني كتابة (على سبيل المثال) cd /media/ ثم اضغط على السهم لأعلى للانتقال إلى آخر شيء أنا cd 'd إلى داخل /media/ folder.

(أستخدم Gnome Terminal ، قد تحتاج إلى تغيير رموز الهروب من أجل المحاكيات الطرفية الأخرى.)

إن إكمال Bash مفيد أيضًا أيضًا ، لكنه إضافة أكثر براعة. في ~/.bashrc :

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

سيؤدي هذا إلى تمكين إتمام علامة التبويب لكل برنامج (على سبيل المثال ، محاولة اكتمال علامة التبويب عندما يبدأ سطر الأوامر بـ evince سيعرض فقط الملفات التي يمكن فتحها ، كما أنه سيوفر خيارات سطر الأوامر كاملة التبويب).

يعمل بشكل جيد مع هذا أيضًا في ~/.inputrc :

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

pbcopy

هذا نسخ إلى الحافظة نظام Mac. يمكنك أوامر الأنابيب إليها ... حاول:

pwd | pbcopy


عند تنزيل ملف كبير أفعله كثيرًا:

while ls -la <filename>; do sleep 5; done

ثم ctrl + c فقط عند انتهائي (أو إذا كانت ls ترجع بدون الصفر). إنها تشبه برنامج watch ولكنها تستخدم القشرة بدلاً من ذلك ، لذا فهي تعمل على منصات دون watch .

أداة أخرى مفيدة هي netcat ، أو nc . اذا فعلت:

nc -l -p 9100 > printjob.prn

بعد ذلك ، يمكنك إعداد طابعة على كمبيوتر آخر ، ولكن بدلاً من ذلك ، استخدم عنوان IP الخاص بجهاز الكمبيوتر الذي يقوم بتشغيل netcat. عند إرسال مهمة الطباعة ، يتم استلامها بواسطة الكمبيوتر الذي يقوم بتشغيل netcat ويتم إلقاؤه في printjob.prn .


لقد كنت دائمًا جزئيًا لما يلي:

ctrl-E # move cursor to end of line
ctrl-A # move cursor to beginning of line

أنا أيضا استخدام shopt -s cdable_vars ، ثم يمكنك إنشاء متغيرات باش إلى الدلائل الشائعة. لذلك ، بالنسبة لشجرة مصدر شركتي ، أقوم بإنشاء مجموعة من المتغيرات مثل:

export Dcentmain="/var/localdata/p4ws/centaur/main/apps/core"

ثم يمكنني تغيير ذلك الدليل عن طريق cd Dcentmain .


لقد حصلت على سلاح سري: shell-fu.

هناك الآلاف من النصائح الذكية ، والحيل الرائعة والوصفات الفعالة التي تناسب معظم الوقت على خط واحد.

واحدة أحبها (لكنني أغشش قليلاً لأنني استخدم حقيقة أن Python مثبتة على معظم أنظمة Unix الآن):

alias webshare='python -m SimpleHTTPServer'

الآن في كل مرة تكتب "webshare" ، سيكون الدليل الحالي متاحًا من خلال المنفذ 8000. لطيفة بالفعل عندما تريد مشاركة الملفات مع الأصدقاء على شبكة محلية بدون مفتاح USB أو جهاز تحكم عن بعد. ستعمل مقاطع الفيديو والموسيقى الجارية أيضًا.

وبالطبع القنبلة الكلاسيكية المعبدة عديمة الفائدة تمامًا ولكنها لا تزال ممتعة جدًا:

$ :(){ :|:& };:

لا تحاول ذلك في خادم الإنتاج ...


المفضلة هي '^ string ^ string2' التي تأخذ الأمر الأخير ، تستبدل السلسلة بـ string2 وتقوم بتنفيذها

$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz

دليل باش لسطر الأوامر


pushd و pushd دائما تقريبا في متناول اليدين


مفضلة أخرى:

!!

يكرر الأمر الأخير الخاص بك. الأكثر فائدة في النموذج:

sudo !!

إعادة تسمية / نقل الملفات ذات اللواحق بسرعة:
cp /home/foo/realllylongname.cpp{,-old}

هذا يوسع إلى:
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old


يمكنك استخدام أمر الساعة بالاقتران مع أمر آخر للبحث عن التغييرات. مثال على ذلك عندما كنت أختبر جهاز التوجيه الخاص بي ، وكنت أرغب في الحصول على أرقام محدثة حول أشياء مثل نسبة الإشارة إلى الضوضاء ، إلخ.

watch --interval=10 lynx -dump http://dslrouter/stats.html

كيفية سرد الدلائل الفرعية فقط في الحالية؟

ls -d */

إنها مجرد خدعة بسيطة ، لكنك لن تعرف كم من الوقت أحتاج إلى إيجاد ذلك!


عند تشغيل الأوامر ، فأحيانًا أرغب في تشغيل أمر يحتوي على الحجج السابقة. للقيام بذلك ، يمكنك استخدام هذا الاختصار:

$ mkdir /tmp/new
$ cd !!:*

من حين لآخر ، بدلاً من استخدام البحث ، سوف أفصل حلقة من سطر واحد إذا كنت بحاجة إلى تشغيل مجموعة من الأوامر في قائمة من الملفات.

for file in *.wav; do lame "$file" "$(basename "$file" .wav).mp3" ; done;

إن تكوين خيارات محفوظات سطر الأوامر في .bash_login (أو .bashrc) مفيد حقًا. ما يلي هو مجموعة من الإعدادات التي أستخدمها على جهاز Macbook Pro.

يجعل الإعداد التالي أوامر bash محو مكررة في سجلك:

export HISTCONTROL="erasedups:ignoreboth"

أنا أيضا جاك حجم التاريخ الخاص بي حتى عالية جدا أيضا. لما لا؟ لا يبدو أن إبطاء أي شيء على المعالجات الدقيقة اليوم.

export HISTFILESIZE=500000
export HISTSIZE=100000

شيء آخر أفعله هو تجاهل بعض الأوامر من تاريخي. لا حاجة لتذكر أمر الخروج.

export HISTIGNORE="&:[ ]*:exit"

أنت بالتأكيد تريد ضبط histappend. وإلا ، فستستبدل bash سِجلك عند الخروج.

shopt -s histappend

خيار آخر يمكنني استخدامه هو cmdhist. يتيح لك هذا حفظ أوامر متعددة الأسطر إلى السجل كإجراء واحد.

shopt -s cmdhist

وأخيرًا ، في نظام التشغيل Mac OS X (إذا كنت لا تستخدم وضع vi) ، فستحتاج إلى إعادة تعيين <CTRL> -S من إيقاف التمرير. هذا يمنع باش من القدرة على تفسيره كبحث إلى الأمام.

stty stop ""

إعادة تسمية

مثال:

$ ls
this_has_text_to_find_1.txt
this_has_text_to_find_2.txt
this_has_text_to_find_3.txt
this_has_text_to_find_4.txt

$ rename 's/text_to_find/been_renamed/' *.txt
$ ls
this_has_been_renamed_1.txt
this_has_been_renamed_2.txt
this_has_been_renamed_3.txt
this_has_been_renamed_4.txt

مفيدة جدا


أكثر من الجدة ، لكنه ذكي ...

أهم 10 أوامر مستخدمة:

$ history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -nr | head

إخراج العينة:

 242 git
  83 rake
  43 cd
  33 ss
  24 ls
  15 rsg
  11 cap
  10 dig
   9 ping
   3 vi

^ R البحث العكسي. اضغط على ^ R ، اكتب جزءًا من أمر سابق ترغب في مطابقته ، ثم اضغط على ^ R حتى تعثر على الأمر الذي تريده. ثم لا يتعين عليّ تذكر الأوامر التي تم استخدامها مؤخرًا والتي لا تزال في السجل الخاص بي. ليس باش على وجه الحصر ، ولكن أيضًا: ^ E لنهاية السطر ، ^ A لبداية السطر ، ^ U و ^ K لحذف قبل وبعد المؤشر ، على التوالي.


type -a PROG

من أجل العثور على جميع الأماكن التي يتوفر فيها PROG ، عادة ما تكون في مكان ما ~ / bin بدلاً من الواحد الموجود في / usr / bin / PROG الذي ربما كان متوقعًا.


بالتأكيد ، يمكنك " diff file1.txt file2.txt " ، لكن Bash يدعم عملية الاستبدال ، والتي تسمح لك diff مخرجات الأوامر.

على سبيل المثال ، لنفترض أنني أريد التأكد من أن البرنامج النصي الخاص بي يعطيني الناتج الذي أتوقعه. يمكنني فقط التفاف نصي الخاص بي في <() diff للحصول على اختبار وحدة سريعة وقذرة:

$ cat myscript.sh
#!/bin/sh
echo -e "one\nthree"
$
$ ./myscript.sh 
one
three
$
$ cat expected_output.txt
one
two
three
$
$ diff <(./myscript.sh) expected_output.txt
1a2
> two
$

كمثال آخر ، لنفترض أنني أريد التحقق مما إذا كان هناك خادمان لهما نفس قائمة RPMs المثبتة. بدلاً من إرسالها إلى كل خادم ، قم بكتابة كل قائمة من RPMs لفصل الملفات ، وإجراء diff على تلك الملفات ، يمكنني فقط إجراء diff عن محطة العمل الخاصة بي:

$ diff <(ssh server1 'rpm -qa | sort') <(ssh server2 'rpm -qa | sort')
241c240
< kernel-2.6.18-92.1.6.el5
---
> kernel-2.6.18-92.el5
317d315
< libsmi-0.4.5-2.el5
727,728d724
< wireshark-0.99.7-1.el5
< wireshark-gnome-0.99.7-1.el5
$

هناك المزيد من الأمثلة في دليل Advanced Bash-Scripting على http://tldp.org/LDP/abs/html/process-sub.html .


أنا أحب أن بناء أوامر مع صدى وأنبوب لهم إلى قذيفة:

$ find dir -name \*~ | xargs echo rm
...
$ find dir -name \*~ | xargs echo rm | ksh -s

لماذا ا؟ لأنه يسمح لي بالنظر إلى ما سيحدث قبل أن أفعل ذلك. بهذه الطريقة إذا كان لدي خطأ فظيع (مثل إزالة الدليل الرئيسي الخاص بي) ، يمكنني التقاطه قبل حدوثه. من الواضح أن هذا هو الأكثر أهمية بالنسبة للإجراءات التدميرية أو غير القابلة للإلغاء.


ESC .

إدراج الوسيطات الأخيرة من الأمر الأخير bash. انها تأتي في متناول اليدين أكثر مما تعتقدون.

cp file /to/some/long/path

مؤتمر نزع السلاح ESC .


سلسلة أوامر متعددة باستخدام الأمر && :

./run.sh && tail -f log.txt

أو

kill -9 1111 && ./start.sh

على غرار الكثير أعلاه ، فإن مفضلي الحالي هو ضغط المفاتيح [alt]. (Alt ومفاتيح "." معاً) هذا هو نفس $! (إدراج الوسيطة الأخيرة من الأمر السابق) باستثناء أنه من الأسهل بالنسبة لي الكتابة بسهولة. (فقط لا يمكن استخدامها في البرامج النصية)

على سبيل المثال:

mkdir -p /tmp/test/blah/oops/something
cd [alt].

$ touch {1,2}.txt
$ ls [12].txt
1.txt  2.txt
$ rm !:1
rm [12].txt
$ history | tail -10
...
10007  touch {1,2}.txt
...
$ !10007
touch {1,2}.txt
$ for f in *.txt; do mv $f ${f/txt/doc}; done

غالباً ما يكون لديّ أسماء مستعارة لـ vi، ls، etc. لكن في بعض الأحيان تريد الهروب من الاسم المستعار. ما عليك سوى إضافة شرطة مائلة للخلف إلى الأمر في المقدمة:

على سبيل المثال:

$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM

رائع أليس كذلك؟





command-line