ما هو الأكثر المفضلة سطر الأوامر خدعة باستخدام باش ؟ [مغلقة]
-
09-06-2019 - |
سؤال
نحن جميعا نعرف كيفية استخدام <ctrl>-R
عكس البحث عبر التاريخ ، ولكن هل تعلم أنه يمكنك استخدام <ctrl>-S
إلى الأمام البحث إذا قمت بتعيين stty stop ""
?أيضا, هل حاولت من أي وقت مضى تشغيل ربط p لمشاهدة جميع اختصارات لوحة المفاتيح المذكورة ؟ هناك أكثر من 455 على نظام التشغيل Mac OS X بشكل افتراضي.
ما هو الأكثر المفضلة غامضة خدعة, اختصار لوحة المفاتيح أو shopt التكوين باستخدام باش ؟
المحلول 7
عند تشغيل الأوامر في بعض الأحيان سوف تحتاج إلى تشغيل الأمر مع سابقاتها الحجج.للقيام بذلك يمكنك استخدام هذا الاختصار:
$ mkdir /tmp/new
$ cd !!:*
أحيانا بدلا من استخدام تجد سوف الخروج من سطر واحد حلقة إذا كنت بحاجة إلى تشغيل مجموعة من الأوامر في قائمة الملفات.
for file in *.wav; do lame "$file" "$(basename "$file" .wav).mp3" ; done;
تكوين سطر التاريخ الخيارات في بلدي .bash_login (أو .bashrc) هي مفيدة حقا.التالي هو مجموعة من الإعدادات التي أنا استخدامها على بلدي ماك بوك برو.
الإعداد التالية يجعل باش محو تكرار الأوامر في التاريخ:
export HISTCONTROL="erasedups:ignoreboth"
أنا أيضا جاك التاريخ حجم ما يصل عالية جدا جدا.لماذا لا ؟ لا يبدو أن بطء أي شيء في اليوم المعالجات.
export HISTFILESIZE=500000
export HISTSIZE=100000
آخر شيء أقوم به هو تجاهل بعض الأوامر من تاريخ بلادي.لا تحتاج إلى تذكر الأمر إنهاء.
export HISTIGNORE="&:[ ]*:exit"
بالتأكيد كنت ترغب في تعيين histappend.وإلا باش الكتابة الخاصة بك التاريخ عند الخروج.
shopt -s histappend
خيار آخر التي تستخدم cmdhist.هذا يتيح لك حفظ متعدد سطر الأوامر إلى التاريخ كما أمر واحد.
shopt -s cmdhist
وأخيرا على نظام التشغيل Mac OS X (إذا كنت لا تستخدم السادس واسطة), سوف تحتاج إلى إعادة تعيين <CTRL>-S من انتقل تتوقف.هذا باش يمنع من أن تكون قادرة على تفسير ذلك إلى الأمام البحث.
stty stop ""
نصائح أخرى
إعادة تسمية/نقل الملفات ذات اللواحق بسرعة:
cp /home/foo/realllylongname.cpp{,-old}
هذا يوسع إلى:
cp /home/foo/realllylongname.cpp /home/foo/realllylongname.cpp-old
cd -
إنه سطر الأوامر ما يعادلها من الزر الخلفي (يأخذك إلى المجلد السابق كنت في).
آخر المفضلة:
!!
يكرر آخر الأمر.مفيدة للغاية في شكل:
sudo !!
بلدي المفضل هو '^سلسلة^string2' الذي يستغرق الأمر الأخير ، يستبدل سلسلة مع string2 وينفذ ذلك
$ ehco foo bar baz
bash: ehco: command not found
$ ^ehco^echo
foo bar baz
إعادة تسمية
على سبيل المثال:
$ 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
مفيدة جدا
أنا من المعجبين !$
, !^
و !*
expandos العائدين من أحدث المقدمة سطر الأوامر:البند الأول غير البند القيادة ، غير الأمر البنود.إلى الطرافة (لاحظ أن قذيفة بطباعة الأمر الأول):
$ echo foo bar baz
foo bar baz
$ echo bang-dollar: !$ bang-hat: !^ bang-star: !*
echo bang-dollar: baz bang-hat: foo bang-star: foo bar baz
bang-dollar: baz bang-hat: foo bang-star: foo bar baz
هذا يأتي في متناول اليدين عندما كنت أقول ls filea fileb
, و تريد تحرير واحد منهم: vi !$
أو كليهما: vimdiff !*
.كما يمكن تعميمها على " ، n
ال حجة" مثل ذلك:
$ echo foo bar baz
$ echo !:2
echo bar
bar
أخيرا, مع pathnames ، يمكنك الحصول على أجزاء من طريق إلحاق :h
و :t
إلى أي من أعلاه expandos:
$ ls /usr/bin/id
/usr/bin/id
$ echo Head: !$:h Tail: !$:t
echo Head: /usr/bin Tail: id
Head: /usr/bin Tail: id
كيفية قائمة فقط الدلائل في المرحلة الحالية ؟
ls -d */
انها خدعة بسيطة ، ولكن أنت لا تعرف كم من الوقت كنت بحاجة إلى العثور على هذا واحد !
ESC.
إدراج آخر الحجج من آخر باش الأمر.يتعلق الأمر في متناول اليدين أكثر مما كنت أعتقد.
cp file /to/some/long/path
cd ESC.
بالطبع يمكنك "diff file1.txt file2.txt
"،ولكن باش يدعم عملية الاستبدال, الذي يسمح لك 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
$
وكمثال آخر ، دعونا نقول كنت ترغب في التحقق إذا كان اثنين من الخوادم لديها نفس القائمة من اللفات في الدقيقة المثبتة.بدلا من sshing إلى كل ملقم كتابة كل قائمة من 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
$
وهناك المزيد من الأمثلة في المتقدمة باش البرمجة دليل على http://tldp.org/LDP/abs/html/process-sub.html.
بلدي المفضل الأمر "ls-ثور"
واستجمع على قوة الآلهة قائمة أحدث الملفات التي تم تعديلها في سهولة تنسيق قابل للقراءة.
أكثر من الجدة, لكنه ذكي...
أعلى 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 في نهاية الخط ، ^أ بداية الخط ، ^U ^K حذف قبل وبعد المؤشر ، على التوالي.
أنا غالبا ما يكون من الأسماء المستعارة بالنسبة السادس, هل, الخ.ولكن في بعض الأحيان كنت ترغب في الهروب من الاسم المستعار.فقط إضافة شرطة مائلة إلى الخلف إلى القيادة في الجبهة:
على سبيل المثال:
$ alias vi=vim
$ # To escape the alias for vi:
$ \vi # This doesn't open VIM
بارد, أليس كذلك ؟
وهنا زوجين من القرص التكوين:
~/.inputrc
:
"\C-[[A": history-search-backward
"\C-[[B": history-search-forward
هذا يعمل نفس ^R
ولكن باستخدام مفاتيح الأسهم بدلا من ذلك.هذا يعني أنني أستطيع نوع (على سبيل المثال) cd /media/
ثم ضرب السهم للذهاب إلى آخر ما cd
'د إلى داخل /media/
المجلد.
(أنا استخدم جنوم المحطة ، قد تحتاج إلى تغيير الهروب رموز محطة أخرى محاكاة.)
باش الإنجاز هو أيضا مفيدة بشكل لا يصدق, لكنه الآن أكثر مكرا ذلك.في ~/.bashrc
:
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
وهذا سيمكن لكل برنامج tab-الانتهاء (على سبيل المثالمحاولة التبويب الانتهاء عند سطر الأوامر يبدأ مع evince
سوف تظهر فقط الملفات التي يبدي يمكن فتح هذا التبويب-استكمال خيارات سطر الأوامر).
يعمل بشكل جيد مع هذا أيضا في ~/.inputrc
:
set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on
يمكنني استخدام التالية الكثير:
على :p
التعديل لطباعة التاريخ النتيجة.E. g.
!!:p
طباعة الأمر الأخير حتى تتمكن من التحقق من أنه من الصحيح قبل تشغيله مرة أخرى.فقط أدخل !!
لتنفيذ ذلك.
في سياق مماثل:
!?foo?:p
سيتم البحث الخاصة بك التاريخ على أحدث الأوامر التي تحتوي على سلسلة 'فو' وطباعته.
إذا كنت لا تحتاج إلى طباعة ،
!?foo
هل بحث في تنفيذ ذلك على الفور.
لدي سلاح سري : شل-فو.
هناك آلاف من النصائح الذكية ، بارد الحيل الفعالة وصفات معظم الوقت مناسبا على خط واحد.
واحدة أن أنا الحب (لكن الغش قليلا منذ أن كنت تستخدم حقيقة أن الثعبان مثبت على معظم نظام يونكس الآن) :
alias webshare='python -m SimpleHTTPServer'
الآن في كل مرة كنت اكتب "webshare" ، الدليل الحالي سوف تكون متاحة من خلال المنفذ 8000.جميلة حقا عندما تريد مشاركة الملفات مع أصدقائك على الشبكة المحلية بدون مفتاح usb أو بعيد dir.الفيديو و الموسيقى ستعمل أيضا.
وبالطبع الكلاسيكية شوكة القنبلة التي هي عديمة الفائدة تماما ولكن لا يزال هناك الكثير من المرح :
$ :(){ :|:& };:
لا تحاول أن خادم إنتاج...
يمكنك استخدام ووتش الأمر بالتزامن مع أمر آخر للبحث عن التغييرات.مثال على ذلك عندما كنت في اختبار جهاز التوجيه الخاص بي ، وأنا أرغب في الحصول على ما يصل إلى تاريخ الأرقام على أشياء مثل إشارة إلى نسبة الضوضاء ، إلخ.
watch --interval=10 lynx -dump http://dslrouter/stats.html
type -a PROG
من أجل العثور على جميع أماكن PROG تتوفر عادة في مكان ما في ~/بن بدلا من واحد في /usr/bin/PROG أنه قد كان من المتوقع.
أحب أن بناء الأوامر صدى و الأنابيب إلى شل:
$ find dir -name \*~ | xargs echo rm
...
$ find dir -name \*~ | xargs echo rm | ksh -s
لماذا ؟ لأنه يسمح لي أن ننظر إلى ما هو ذاهب الى القيام به قبل أن أفعل ذلك.بهذه الطريقة إذا كان لدي الرهيبة خطأ (مثل إزالة الدليل بيتي), أنا يمكن أن قبض عليه قبل أن يحدث.ومن الواضح أن هذا هو الأهم بالنسبة المدمرة أو لا رجعة فيه الإجراءات.
عند تحميل ملف كبير أنا في كثير من الأحيان القيام به:
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
.
pushd
و popd
تقريبا دائما تأتي في متناول اليدين
واحد يفضل طريقة التنقل عندما أنا باستخدام الدلائل متعددة على نطاق واسع في أماكن منفصلة في شجرة التسلسل الهرمي هو استخدام acf_func.sh (المدرجة أدناه).مرة واحدة محددة ، يمكنك أن تفعل
مؤتمر نزع السلاح --
لمشاهدة قائمة مؤخرا الدلائل ، مع العددية القائمة
cd -2
للذهاب إلى الثانية الأخيرة دليل.
من السهل جدا للاستخدام, مفيد جدا.
هنا كود:
# do ". acd_func.sh"
# acd_func 1.0.5, 10-nov-2004
# petar marinov, http:/geocities.com/h2428, this is public domain
cd_func ()
{
local x2 the_new_dir adir index
local -i cnt
if [[ $1 == "--" ]]; then
dirs -v
return 0
fi
the_new_dir=$1
[[ -z $1 ]] && the_new_dir=$HOME
if [[ ${the_new_dir:0:1} == '-' ]]; then
#
# Extract dir N from dirs
index=${the_new_dir:1}
[[ -z $index ]] && index=1
adir=$(dirs +$index)
[[ -z $adir ]] && return 1
the_new_dir=$adir
fi
#
# '~' has to be substituted by ${HOME}
[[ ${the_new_dir:0:1} == '~' ]] && the_new_dir="${HOME}${the_new_dir:1}"
#
# Now change to the new dir and add to the top of the stack
pushd "${the_new_dir}" > /dev/null
[[ $? -ne 0 ]] && return 1
the_new_dir=$(pwd)
#
# Trim down everything beyond 11th entry
popd -n +11 2>/dev/null 1>/dev/null
#
# Remove any other occurence of this dir, skipping the top of the stack
for ((cnt=1; cnt <= 10; cnt++)); do
x2=$(dirs +${cnt} 2>/dev/null)
[[ $? -ne 0 ]] && return 0
[[ ${x2:0:1} == '~' ]] && x2="${HOME}${x2:1}"
if [[ "${x2}" == "${the_new_dir}" ]]; then
popd -n +$cnt 2>/dev/null 1>/dev/null
cnt=cnt-1
fi
done
return 0
}
alias cd=cd_func
if [[ $BASH_VERSION > "2.05a" ]]; then
# ctrl+w shows the menu
bind -x "\"\C-w\":cd_func -- ;"
fi
توسيع خطوط معقدة قبل أن تصل اللعين يدخل
- Alt+Ctrl+هـ — شل-توسيع الخط (قد تحتاج إلى استخدام Esc, Ctrl+هـ على لوحة المفاتيح)
- Ctrl+_ — التراجع
- Ctrl+x, * — غلوب-توسيع-كلمة
$ echo !$ !-2^ *
Alt+Ctrl+هـ
$ echo aword someotherword *
Ctrl+_
$ echo !$ !-2^ *
Ctrl+x, *
$ echo !$ !-2^ LOG Makefile bar.c foo.h
&c.
لقد كنت دائما جزئية:
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
.
pbcopy
هذا نسخ إلى نظام ماك الحافظة.يمكنك الأنابيب الأوامر إلى ذلك...حاول:
pwd | pbcopy
$ 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
باستخدام مجموعة -o السادس من سطر الأوامر, أو أفضل, في .bashrc ، يضعك في السادس وضع التحرير على سطر الأوامر.البدء في "إدراج" وضع بحيث يمكنك كتابة و backspace بشكل طبيعي, ولكن إذا كنت تجعل من "كبير" خطأ يمكنك أن تضغط على مفتاح esc ثم استخدام 'ب' و 'و' للتحرك كما كنت تفعل في السادس.cw إلى تغيير كلمة واحدة.مفيدة بشكل خاص بعد أن كنت قد ترعرعت في التاريخ الأمر الذي تريد تغييره.
على غرار العديد من أعلاه المفضلة الحالي هو ضغطة مفتاح [alt].(Alt و "." مفاتيح معا) هذا هو نفس $!(إدراج آخر حجة من الأمر السابق) إلا أنه فورية بالنسبة لي أسهل نوع.(لا يمكن استخدامها في البرامج النصية)
على سبيل المثال:
mkdir -p /tmp/test/blah/oops/something
cd [alt].
سلسلة أوامر متعددة معا باستخدام && الأمر:
./run.sh && tail -f log.txt
أو
kill -9 1111 && ./start.sh