ما هو الأكثر المفضلة سطر الأوامر خدعة باستخدام باش ؟ [مغلقة]

StackOverflow https://stackoverflow.com/questions/68372

  •  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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top