อะไรคือคุณสมบัติหรือลูกเล่นบรรทัดคำสั่งที่คุณชื่นชอบ?


94

แบ่งปันคุณสมบัติและลูกเล่นบรรทัดคำสั่งของคุณสำหรับ Unix / Linux พยายามเก็บเปลือกหอย / ผู้ไม่เชื่อเรื่องพระเจ้า distro ถ้าเป็นไปได้ สนใจเห็น aliases, one-liners, คีย์ลัด, เชลล์สคริปต์ขนาดเล็ก ฯลฯ

คำตอบ:


89

สิ่งนี้จะขยายออกไปตาม!!เคล็ดลับที่กล่าวถึงในคำตอบนี้ มีคำสั่งที่เกี่ยวข้องกับประวัติศาสตร์มากมายที่มักจะถูกลืม (ผู้คนมักจะแทงUp100 ครั้งแทนที่จะมองหาคำสั่งที่พวกเขารู้ว่าพวกเขาพิมพ์)

  • historyคำสั่งจะแสดงรายการของคำสั่งที่เรียกใช้เมื่อเร็ว ๆ นี้ที่มี designator เหตุการณ์ไปทางซ้าย
  • !N จะแทนที่คำสั่งที่เกี่ยวข้องกับตัวกำหนดเหตุการณ์ N
  • !-NจะทดแทนN THคำสั่งล่าสุด; เช่น!-1จะแทนที่คำสั่งล่าสุดล่าสุด!-2เป็นอันดับสองเป็นต้น
  • ดังที่กล่าวไว้ในคำตอบอื่น ๆ ซึ่ง!!เป็นที่จดย่อ!-1เพื่อทดแทนคำสั่งสุดท้ายอย่างรวดเร็ว
  • !string จะแทนที่คำสั่งล่าสุดที่เริ่มต้นด้วย string
  • !?string? จะแทนที่คำสั่งล่าสุดที่มี string

นักออกแบบ Word สามารถเพิ่มลงใน!คำสั่งประวัติเพื่อแก้ไขผลลัพธ์ ลำไส้ใหญ่แยกเหตุการณ์และคำว่า designators !!:0เช่น designator เหตุการณ์!!สามารถยากที่จะเพียงแค่!เมื่อใช้ designator คำเพื่อให้เทียบเท่ากับ!!:0!:0

  • !:0 จะได้รับคำสั่งที่ถูกดำเนินการ
  • !:1จะได้รับการโต้แย้งครั้งแรก (และ!:2ครั้งที่สอง ฯลฯ )
  • !:2-3 จะได้รับอาร์กิวเมนต์ที่สองและสาม
  • !:^เป็นอีกวิธีในการรับอาร์กิวเมนต์แรก !:$จะได้รับล่าสุด
  • !:*จะได้รับการขัดแย้งทั้งหมด (แต่ไม่ใช่คำสั่ง)

โมดิฟายเออร์ยังสามารถผนวกเข้ากับ!คำสั่งประวัติแต่ละคำนำหน้าโดยโคลอน หมายเลขใด ๆ สามารถวางซ้อนกันบน (เช่น!:t:r:p)

  • h - จัดเรียงชื่อไฟล์ฐาน
  • t - ชื่อไฟล์ฐานเท่านั้น
  • r - เรียงแถวส่วนขยายชื่อไฟล์
  • e - เฉพาะนามสกุลไฟล์
  • s/search/replacement- แทนที่การเกิดขึ้นครั้งแรกของsearchด้วยreplacement
  • gs/search/replacement- แทนที่เหตุการณ์ทั้งหมดsearchด้วยreplacement

3
และถ้าคุณใช้ Bash (อาจเหมือนกันสำหรับเชลล์อื่น ๆ ) M- ^ (Meta- ^) ขยายตัวดำเนินการส่วนขยายประวัติด้านบนให้กับคุณในกรณีที่คุณต้องการเห็นสิ่งที่คุณอ้างถึงจริง ๆ ไปยัง
Eric Smith

1
ฉันไม่เคยพบการใช้งานสำหรับ! สิ่งที่สั่ง ดูเหมือนว่าฉันจะเรียกใช้คำสั่งที่ฉันไม่เห็น มันง่ายมากที่จะพิมพ์! -3 แทนที่จะเป็น! -4 และใครจะรู้ว่าจะเกิดอะไรขึ้น การค้นหาหมายเลขบรรทัดของคำสั่งที่ฉันต้องการเรียกใช้มักจะเจ็บปวดกว่าความคุ้มค่า กลเม็ดเด็ดพราย แต่ฉันไม่เคยพบการใช้งานจริงสำหรับพวกเขา
Falmarri

1
@Falmarri ฉันไม่เคยใช้!-#อย่างใดอย่างหนึ่ง ฉันใช้!stringเพื่อเรียกใช้คำสั่งสุดท้ายที่เริ่มต้นด้วยสตริง แต่โดยทั่วไปแล้วแท็บกรอกให้ครบถ้วนก่อน (zsh) เพื่อให้แน่ใจว่าฉันกำลังรันสิ่งที่ถูกต้อง
Michael Mrozek

1
No! :) "การรัน!Nจะรันคำสั่ง ... " เป็นคำอธิบายที่แคบเกินไป จริง ๆ แล้ว!Nจะถูกแทนที่ด้วยคำสั่ง ... ; และคำอธิบายทั้งหมดในคำตอบ ถูกต้องมากขึ้นและเปิดโอกาสที่มีประโยชน์มากขึ้น! sudo !!เช่นที่กล่าวมา
imz - Ivan Zakharyaschev

1
ในการรันคำสั่งก่อนหน้าค้นหาสตริงโดยปกติฉันเพียงแค่กด Ctrl-R Ctrl-R หลายตัวจะขุดลึกลงไปในประวัติศาสตร์ ด้วยวิธีนี้ฉันเห็นคำสั่งที่พบในทันทีและสามารถละทิ้งมันและดูเพิ่มเติม Ctrl-G หนีออกจากโหมดนี้ ความไม่สะดวกเพียงอย่างเดียวคือ Ctrl-R ใช้สำหรับbash; ใน Emacs เพื่อเรียกดูประวัติคำสั่งอินพุตและค่า (สำหรับ Mx หรือค่าการอ่านอื่น ๆ ) หนึ่งใช้ Meta-R แทน (Meta-R ยังใช้eshellใน Emacs) ดังนั้นฉันมักจะทำให้พวกเขาสับสน
imz - Ivan Zakharyaschev

65

bash - แทรกพารามิเตอร์สุดท้ายของบรรทัดก่อนหน้า

alt- . คีย์ผสมที่มีประโยชน์ที่สุดลองและดูด้วยเหตุผลบางอย่างที่ไม่มีใครรู้เกี่ยวกับอันนี้

กดอีกครั้งและอีกครั้งเพื่อเลือกพารามิเตอร์สุดท้ายที่เก่ากว่า

ยอดเยี่ยมเมื่อคุณต้องการทำอะไรเพิ่มเติมกับอาร์กิวเมนต์ / ไฟล์ที่คุณใช้เมื่อไม่นานมานี้


11
คุณยังสามารถใช้! $ เพื่ออ้างถึงหาเรื่องล่าสุดในคำสั่งก่อนหน้า สิ่งนี้มีประโยชน์เพราะมันทำงานในสคริปต์เช่นเดียวกับการโต้ตอบ (ทำงานใน bash & zsh)

4
ทุกครั้งที่คุณกดalt- .มันจะไปที่คำสั่งก่อนหน้าและดึงอาร์กิวเมนต์สุดท้ายออกมา ดังนั้นหากคุณต้องการอาร์กิวเมนต์สุดท้ายจากสามคำสั่งที่ผ่านมาเพียงแค่กดalt- .สามครั้ง
Clee

2
นี่คือการเชื่อมโยงคีย์เริ่มต้นสำหรับyank-last-argคำสั่ง readline ดังนั้นจึงควรทำงานกับโปรแกรมใด ๆ ที่เชื่อมโยงกับ readline ไม่ใช่เพียงแค่ BASH หรือ ZSH
James Sneeringer

ในโหมด vi ฉันต้องรีบูต yank-last-arg ตามคำตอบนี้: superuser.com/questions/18498/…
Jeromy Anglim

ใน xterm, meta- สร้าง® แต่คุณสามารถใช้ esc แทน meta (โดยทั่วไปใน bash) ดังนั้น esc- แทน.
derobert

49

สิ่งที่ฉันชอบคือ

man 7 ascii

ง่ายและมีประโยชน์มาก

   Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
   ────────────────────────────────────────────────────────────────────────
   000   0     00    NUL '\0' (null character)   100   64    40    @
   001   1     01    SOH (start of heading)      101   65    41    A
   002   2     02    STX (start of text)         102   66    42    B
   003   3     03    ETX (end of text)           103   67    43    C
   004   4     04    EOT (end of transmission)   104   68    44    D
   005   5     05    ENQ (enquiry)               105   69    45    E
   006   6     06    ACK (acknowledge)           106   70    46    F
   007   7     07    BEL '\a' (bell)             107   71    47    G
   010   8     08    BS  '\b' (backspace)        110   72    48    H
   011   9     09    HT  '\t' (horizontal tab)   111   73    49    I
   012   10    0A    LF  '\n' (new line)         112   74    4A    J
   013   11    0B    VT  '\v' (vertical tab)     113   75    4B    K
   014   12    0C    FF  '\f' (form feed)        114   76    4C    L
   015   13    0D    CR  '\r' (carriage ret)     115   77    4D    M
   016   14    0E    SO  (shift out)             116   78    4E    N
   017   15    0F    SI  (shift in)              117   79    4F    O
   020   16    10    DLE (data link escape)      120   80    50    P
   021   17    11    DC1 (device control 1)      121   81    51    Q
   022   18    12    DC2 (device control 2)      122   82    52    R
   023   19    13    DC3 (device control 3)      123   83    53    S
   024   20    14    DC4 (device control 4)      124   84    54    T
   025   21    15    NAK (negative ack.)         125   85    55    U
   026   22    16    SYN (synchronous idle)      126   86    56    V
   027   23    17    ETB (end of trans. blk)     127   87    57    W
   030   24    18    CAN (cancel)                130   88    58    X
   031   25    19    EM  (end of medium)         131   89    59    Y
   032   26    1A    SUB (substitute)            132   90    5A    Z
   033   27    1B    ESC (escape)                133   91    5B    [
   034   28    1C    FS  (file separator)        134   92    5C    \  '\\'
   035   29    1D    GS  (group separator)       135   93    5D    ]
   036   30    1E    RS  (record separator)      136   94    5E    ^
   037   31    1F    US  (unit separator)        137   95    5F    _
   040   32    20    SPACE                       140   96    60    `
   041   33    21    !                           141   97    61    a
   042   34    22    "                           142   98    62    b
   043   35    23    #                           143   99    63    c
   044   36    24    $                           144   100   64    d
   045   37    25    %                           145   101   65    e
   046   38    26    &                           146   102   66    f
   047   39    27    '                           147   103   67    g
   050   40    28    (                           150   104   68    h
   051   41    29    )                           151   105   69    i
   052   42    2A    *                           152   106   6A    j
   053   43    2B    +                           153   107   6B    k
   054   44    2C    ,                           154   108   6C    l
   055   45    2D    -                           155   109   6D    m

   056   46    2E    .                           156   110   6E    n
   057   47    2F    /                           157   111   6F    o
   060   48    30    0                           160   112   70    p
   061   49    31    1                           161   113   71    q
   062   50    32    2                           162   114   72    r
   063   51    33    3                           163   115   73    s
   064   52    34    4                           164   116   74    t
   065   53    35    5                           165   117   75    u
   066   54    36    6                           166   118   76    v
   067   55    37    7                           167   119   77    w
   070   56    38    8                           170   120   78    x
   071   57    39    9                           171   121   79    y
   072   58    3A    :                           172   122   7A    z
   073   59    3B    ;                           173   123   7B    {
   074   60    3C    <                           174   124   7C    |
   075   61    3D    =                           175   125   7D    }
   076   62    3E    >                           176   126   7E    ~
   077   63    3F    ?                           177   127   7F    DEL

ดูที่commandlinefu.comเว็บไซต์นี้

คุณสามารถดูบทความทั้งสี่นี้โดย Peteris Krumins บนบล็อกของเขา


2
ascii โปรแกรมแยกต่างหากก็มีประโยชน์เช่นกัน นอกเหนือจากการพิมพ์ตารางยังช่วยให้คุณสามารถค้นหาอักขระได้หนึ่งตัวหรือมากกว่า
Matthew Flaschen


42

ไม่แน่ใจว่านี่เป็น "เคล็ดลับ" หรือไม่ แต่ผู้คนดูเหมือนจะไม่ทราบถึงคีย์ลัดของ readline มาตรฐานมาก ของใช้เฉพาะในเปลือกหอย:

  • Ctrl+ U- ตัดบรรทัดปัจจุบัน
  • Ctrl+ Y- วางเส้นตัดด้วยCtrl+U
  • Ctrl+ L- ล้างหน้าจอและวาดใหม่บรรทัดปัจจุบัน
  • Ctrl+ G- รับบรรทัดใหม่และละทิ้งบรรทัดปัจจุบัน

5
เพียงเพิ่มสองสามรายการเหล่านี้: Ctrl + A เพื่อไปที่จุดเริ่มต้นของบรรทัด Ctrl + E เพื่อไปยังจุดสิ้นสุดของบรรทัด Ctrl-K เพื่อลบจากเคอร์เซอร์ไปที่ท้ายบรรทัด
rsuarez

Ctrl+Lสอดคล้องกับอักขระ FormFeed ascii โดยทั่วไปมันจะวาดหน้าจอใหม่ในแอปพลิเคชันข้อความที่มีหน้าต่างหน้าจอ (เช่นเสียงเรียกเข้า, น้อยกว่า, mc ฯลฯ ) ดีถ้าหน้าจอ "ปนเปื้อน" โดยผลลัพธ์บางอย่างจากโปรแกรมอื่น
hlovdal

การเพิ่มไปยังรายการปุ่มลัด: Ctrl+Wเพื่อตัดหนึ่งคำไปข้างหลังAlt+Fเพื่อไปข้างหน้าหนึ่งคำAlt+Bเพื่อไปข้างหลังหนึ่งคำในบรรทัด ฉันชอบCtrl+YและShift+Insertเพราะคุณสามารถคัดลอกสองบรรทัด หนึ่งคำด้วยCtrl+U(วางด้วยCtrl+Y) และในเวลาเดียวกันคุณสามารถคัดลอกคำอื่น (เลือกบรรทัด) วางด้วย ( Shift+Insert)

36

CTRL+ Rใน BASH สำหรับการค้นหา / เปิดใช้งานคำสั่งที่เรียกใช้ก่อนหน้านี้ (เนื้อหาของ ~ / .bash_history)

ซึ่งมักเป็นประโยชน์อย่างมาก การเรียกใช้นามแฝงนี้จะให้บริการ PWD ผ่าน HTTP (จัดทำดัชนี) บนพอร์ต 8000:

alias webserver="python -m SimpleHTTPServer"

และเนื่องจากฉันทำงานให้ตลอดเวลาและทำให้สแตกและพิมพ์เร็วเกินไปนามแฝงเหล่านี้อาจเป็นของฉันที่ใช้บ่อยที่สุด (อย่างจริงจัง):

alias maek=make
alias mkae=make
alias meak=make
alias amka=make
alias akme=make

และอาจเป็นชิ้นส่วนที่ใช้บ่อยที่สุดของ BASH เป็นสคริปต์ง่ายๆที่ฉันเรียกว่าการอัปโหลด ฉันใช้มันเพื่อลบเนื้อหาประเภทใด ๆ ให้กับ Linode ของฉันและคัดลอก URL HTTP ที่ได้ไปยังคลิปบอร์ดของฉัน (คลิกกลาง) มีประโยชน์มากสำหรับการวางสิ่งของให้กับผู้คนใน IRC:

scp -r $* $user@$host:public_html && {
    URL="http://$host/~$user/$(basename $1)"
    echo "$URL"
    xselection -replace PRIMARY "$URL"
}

แค่สองสาม ฉันสามารถโพสต์ได้มากขึ้นในภายหลังต้องกลับมาทำงาน!


8
alias mk=makeพิมพ์ได้เร็วขึ้นและผิดพลาดน้อยลง หรือคอมไพล์จากเครื่องมือแก้ไขของคุณโดยใช้ปุ่มลัด ...
ลาร์ส Haugseth

BTW Zsh มีการแก้ไขการสะกดคำในตัวซึ่งดีมากในการแก้ไขความผิดพลาดแบบง่าย
Adam Byrtek

นอกจากนี้ใน zsh ฉันคิดว่าค่าเริ่มต้นคือเมื่อคุณกดปุ่ม up จะทำการค้นหาประวัติราวกับว่าคุณกด ctrl r อาจไม่ใช่ค่าเริ่มต้น แต่เป็นการตั้งค่า
Falmarri

ฉันจะพิจารณาalias m=makeหรือแม้กระทั่งm=make -j6หรือคล้ายกัน - ยกเว้นฉันใช้alias m=mutt
jmtd

31

diff เอาต์พุตของสองคำสั่งโดยไม่สร้างไฟล์ชั่วคราวด้วยตนเอง (bash):

diff <(ls dir1) <(ls dir2)

นี่เป็นประโยชน์อย่างยิ่งcommเพราะใช้เฉพาะไฟล์เท่านั้น แต่ในหลายกรณีนั่นเป็นการสิ้นเปลืองไอโหนด
Marcin

30

ค่อนข้างธรรมดา แต่ผู้คนไม่รู้จะกลับมาที่ dir ก่อนหน้า:

cd -

ฉันบอกคุณว่าcd..จาก DOS ถูกฝังอยู่ในความทรงจำของกล้ามเนื้อของฉัน ...
LawrenceC

นี้เป็นรุ่นที่ราคาถูกของ pushd และ popd แม้ว่า ...
โรเบิร์ต Massaioli

ในทำนองเดียวกันมีcd(ไม่มีข้อโต้แย้ง) ซึ่งจะพาคุณไปยังไดเรกทอรีบ้านของคุณ
เหม่ย

ใช่มันบ้าแล้ว มันอยู่ที่ไหนในหน้า man จะแสดงการขยายตัวของ '-'? ฉันพยายาม (และลืม) เพื่อใช้ pushd / popd เสมอ
Chuck R

29

การขยายรั้ง :

การขยายรั้งเป็นกลไกที่อาจสร้างสตริงโดยพลการ

อนุญาตให้คุณแทนที่บรรทัดที่น่าเบื่อเช่น:

mv loong/and/complex/file/name loong/and/complex/file/name.bacukup

ด้วยอินสแตนซ์ที่สั้นกว่า

mv loong/and/complex/file/name{,backup}

การใช้งานอื่น ๆ

# to display the diff between /etc/rc.conf and /etc/rc.conf.pacsave
diff /etc/rc.conf{,.pacsave}

# to list files in both /usr/share and /usr/local/share
ls /usr/{,local}/share 

การขยายเลขคณิต :

การขยายเลขคณิตช่วยให้การประเมินผลของการแสดงออกทางคณิตศาสตร์และการทดแทนของผล รูปแบบสำหรับการขยายเลขคณิตคือ:

$((expression))

การแสดงออกจะได้รับการปฏิบัติราวกับว่ามันอยู่ในเครื่องหมายคำพูดคู่ แต่เครื่องหมายคำพูดคู่ภายในวงเล็บไม่ได้รับการปฏิบัติเป็นพิเศษ โทเค็นทั้งหมดในนิพจน์ได้รับการขยายพารามิเตอร์การขยายสตริงการทดแทนคำสั่งและการลบเครื่องหมายคำพูด การขยายเลขคณิตอาจซ้อนกัน

$ a=1
$ b=2
$ echo $(( a+(b*2) ))
5

3
ดีฉันไม่อยากจะเชื่อเลยว่าฉันลืมเรื่องนี้ นอกจากนี้ยังมีขนาดกะทัดรัดมากขึ้นfoo[123]ที่จะขยายเข้าไปfoo1 foo2 foo3แต่พวกเขาจำเป็นต้องมีชื่อไฟล์เพื่อทำงานในกรณีนั้น
Michael Mrozek

เฮ้ .. ขอบคุณ ... เรียนรู้ทุกวัน +1
สเตฟาน

29

นี้มักจะอยู่ในสคริปต์เริ่มต้นของฉัน (.bashrc, .profile อะไรก็ตาม)

shopt ดีตรวจสอบความคิดเห็น:

shopt -s cdspell        # try to correct typos in path
shopt -s dotglob        # include dotfiles in path expansion
shopt -s hostcomplete   # try to autocomplete hostnames

นามแฝงที่บันทึกการกดแป้นพิมพ์: mkdirและcdเข้าไปยัง:

mkcd () { mkdir -p "$@" && cd "$@"; }

และสุดท้าย แต่ไม่ท้ายสุดฉันได้ยอมจำการท่องไวยากรณ์ tar ดังนั้น:

extract () {
    if [ -f $1 ] ; then
        case $1 in
            *.tar.bz2)  tar xjf $1      ;;
            *.tar.gz)   tar xzf $1      ;;
            *.bz2)      bunzip2 $1      ;;
            *.rar)      rar x $1        ;;
            *.gz)       gunzip $1       ;;
            *.tar)      tar xf $1       ;;
            *.tbz2)     tar xjf $1      ;;
            *.tgz)      tar xzf $1      ;;
            *.zip)      unzip $1        ;;
            *.Z)        uncompress $1   ;;
            *)          echo "'$1' cannot be extracted via extract()" ;;
        esac
    else
        echo "'$1' is not a valid file"
    fi
}

5
+1 ทำไมฉันไม่คิดอย่างนั้น (แยก)
MAK

ฉันมีฟังก์ชั่นที่คล้ายกับmkcdที่ฉันตั้งชื่อ id mdเท่านั้น อย่างไรก็ตามการใช้ "$ @" เป็นอาร์กิวเมนต์สำหรับ cd ไม่สมเหตุสมผลเนื่องจากคุณไม่สามารถทำ cd มากกว่าหนึ่งไดเรกทอรี "$ @" จะใช้งานได้สำหรับ mkdir แต่แล้วคุณจัดการข้อโต้แย้งที่แตกต่างกันสำหรับ mkdir และ cd ดังนั้นฉันอยากจะแนะนำmd () { mkdir -p "$1"; cd "$1" }
hlovdal

ฉันจะเพิ่มคำสั่งเหล่านั้นได้อย่างไร เพียงวางตามที่เป็น. bashrc หรือเพิ่ม "นามแฝง" ต่อหน้าพวกเขา
Asaf

22

สองฟังก์ชั่นทุบตีซึ่งช่วยให้ฉันหลายจังหวะ

ทำ ls โดยอัตโนมัติทุก ๆ ครั้งหลังจากทำ cd สำเร็จ:

function cd {
    builtin cd "$@" && ls
}

ขึ้นไปสู่ระดับ n:

# Usage .. [n]
function .. (){
    local arg=${1:-1};
    local dir=""
    while [ $arg -gt 0 ]; do
        dir="../$dir"
        arg=$(($arg - 1));
    done
    cd $dir #>&/dev/null
}

4
ฉันไม่เคยรู้ที่คุณสามารถทำได้builtin fooเพื่อให้ได้รอบที่มีฟังก์ชั่นที่กำหนดไว้cd; ฉันใช้chdirในการทำงานของฉัน Handy
Michael Mrozek

น่ากลัว เพียงเพิ่ม -F ไปยัง ls ในฟังก์ชั่น cd และมันสมบูรณ์แบบ (สำหรับฉัน)!
frabjous

2
ฉันทำเช่นเดียวกับคุณสำหรับซีดี แต่ฉันมีสติตรวจสอบอีกสองสามและหลีกเลี่ยงการทำ ls ในโหมดที่ไม่โต้ตอบ:cd() { builtin cd -- "$@" && { [ "$PS1" = "" ] || ls -hrt --color; }; }
jmtd

17

เนื่องจากฉันมักจะอยู่กึ่งกลางในบรรทัดคำสั่งก่อนที่จะต้องการค้นหา (CTRL-R ใน bash) ฉันมีสิ่งต่อไปนี้ใน. bashrc ของฉัน

bind '"\e[A"':history-search-backward
bind '"\e[B"':history-search-forward

ซึ่งหมายความว่าถ้าฉันพิมพ์ cd จากนั้นกดขึ้น / ลงฉันจะเห็นตัวเลือกทั้งหมดที่ฉันมี cd'd โดยทั่วไปฉันใช้สิ่งนี้สำหรับ dirs ที่ใช้บ่อย เช่นเดียวกับ "cd w" และฉันก็จบลงด้วยการใช้พื้นที่ทำงานทั้งหมดที่ฉันใช้


อันนี้ยอดเยี่ยมจริงๆ! มันขยายพฤติกรรมลูกศรโดยไม่ทำลายฟังก์ชั่นพื้นฐานขอบคุณ!
philfr

17

สิ่งหนึ่งที่ช่วยฉันประหยัดเวลาได้มากคือคำสั่ง pushd / popd พวกเหล่านี้ช่วยให้คุณสร้างสแต็คของไดเรกทอรีและลดการพิมพ์จำนวนมาก:

/foobar/ > pushd /src/whatever/foo/test
/foobar/src/whatever/foo/test > make run
/foobar/src/whatever/foo/test > popd
/foobar/ > make

2
ใช่ นามแฝง u = pushd; นามแฝง o = popd
canprprates

2
.. และสิ่งที่จะทำuและoยืนอยู่ที่นี่?
deizel

@deizel: ไม่มีอะไรพิเศษเพียงแค่ทางลัดเพื่อหลีกเลี่ยงการพิมพ์
Adam Byrtek

2
ดูเหมือนว่าตัวอักษรตัวที่สองของคำสั่งเนื่องจากทั้งคู่เริ่มต้นด้วย p คุณจึงไม่สามารถใช้สิ่งนั้นกับทั้งคู่ได้
camh

ใน ZSH คุณสามารถsetopt autopushdและการเปลี่ยนแปลงไดเรกทอรีทั้งหมดจะผลักดันโดยอัตโนมัติ
Michael Mrozek

14

คำสั่งscreen โดยทั่วไปจะบันทึกเซสชันบรรทัดคำสั่งของคุณเมื่อคุณกลับมา มันเป็นตัวจัดการเทอร์มินัลเหมือนกับตัวจัดการหน้าต่าง ด้วยวิธีนี้ในเทอร์มินัลเซสชันเดียวคุณสามารถมีเทอร์มินัลเสมือนหลายตัวเกิดขึ้นได้ มันเย็นมาก.

หากมีการใช้screenงานฟังก์ชั่นเปลือกนี้ (ใส่ไว้.bashrc) มีประโยชน์อย่างยิ่ง:

function scr {
    if screen -ls | grep -q Main; then
         # reattach to Main: 
         screen -xr Main
    else
         # name session "Main":
         screen -S Main
    fi
   }

เมื่อพิมพ์scrจะตรวจสอบว่าเซสชันหลักของคุณมีอยู่และจะแนบไปหรือไม่ มิฉะนั้นจะสร้างมันขึ้นมา


ในทางเทคนิคมันเป็นโปรแกรมของตัวเองไม่ใช่ "คำสั่ง"
unperson325680

1
ฉันแนะนำ tmux หรือ dvtm ผ่านหน้าจอ พวกมันทันสมัยและสะอาดกว่า
deltaray

ใช่ "tmux" ดีกว่าหน้าจออย่างไม่มีเหตุผล
ColinM

นอกจากนี้ยังเป็นไปตามอนุสัญญา unix ที่ใช้งานง่าย, ตัวย่อมากขึ้นอย่างใกล้ชิดยิ่งขึ้น :)
user394

13

หากคุณต้องการแก้ไขบรรทัดคำสั่งที่ยาวเป็นพิเศษใน bash

^X^E (Ctrl-X Ctrl-E) 

จะเปิดในตัวแก้ไข ($ EDITOR)

ใน zsh คุณจะได้รับพฤติกรรมเดียวกันโดยเพิ่มสิ่งนี้ลงใน. zshrc:

autoload edit-command-line
zle -N edit-command-line
bindkey '^X^e' edit-command-line 

ว้าวนั่นจะเข้าสู่หนังสือ
l0b0

ใช่และเป็นบันทึกของฉัน!
jyz

12

หากคุณเป็นนักพิมพ์ดีดที่รวดเร็วสิ่งเหล่านี้มีประโยชน์:

alias grpe='grep --color=tty'
alias gpre='grep --color=tty'
alias rgep='grep --color=tty'
alias gerp='grep --color=tty'

แมโครนี้ช่วยให้คุณคำนวณผลรวมของคอลัมน์ของเอาต์พุต: ขนาดไฟล์, ไบต์, แพ็คเก็ตสิ่งที่คุณต้องทำคือระบุคอลัมน์ที่คุณต้องการเพิ่ม:

total ()
{
        if [ x$1 = x ]; then set `echo 1`; fi
        awk "{total += \$$1} END {print total}"
}

คุณใช้มันแบบนี้โดยไม่มีข้อโต้แย้งมันจะเพิ่มผลรวมของคอลัมน์แรก:

du | total

หากคุณระบุอาร์กิวเมนต์มันจะรวมคอลัมน์นั้นซึ่งจะให้จำนวนไบต์ทั้งหมดที่ใช้โดยไฟล์ C # ทั้งหมดใน / tmp:

ls -l /tmp/*cs | total 5

บางครั้งคอนโซลของคุณเกิดความสับสนเพราะคุณดูไฟล์ไบนารีโดยบังเอิญ (ตัวอย่างเช่น cat / bin / ls) คุณสามารถกู้คืนเทอร์มินัลด้วยฟังก์ชั่นเชลล์นี้:

restaura ()
{
    perl -e 'print "\e)B";'
}

ฉันชอบ ls ของฉันเพื่อใช้อักขระเพื่อแยกความแตกต่างของคลาสของไฟล์และเพื่อซ่อนไฟล์สำรองที่สร้างโดยตัวแก้ไขของฉัน (ไฟล์สำรองลงท้ายด้วยอักขระ ~):

alias ls='ls -FB'

อย่าลืม: alias gerp = 'grep --color = tty' ฉันทำอย่างนั้นตลอดเวลา ;-)
Robert Swisher

1
เท่าที่ฉันกังวล "เร็ว" ไม่นับถ้าฉันไม่ถูกต้อง คุณอาจต้องการดูตัวแปร GREP_COLORS และ GREP_OPTIONS
Andy Lester

2
s/fast/sloppy/
Josh

1
ผมใช้ที่คุณใช้reset restaura
jmtd

11
alias s='sudo'
alias r='rake' # i'm a ruby developer
alias ..='cd ..' # although with autocd feature for zsh this comes packed.

หนึ่งในรายการโปรดของฉันเมื่อฉันลืมs:

$ s !! # last command with super user priviledges

2
หากคุณใช้ ZSH คุณสามารถทำสิ่งที่ต้องการbindkey -s '\e[12~' "sudo !!\n"ผูก (ในกรณีนี้) F2 เพื่อเรียกใช้คำสั่งนั้น ฉันมีข้อผูกพันนั้นดังนั้นเมื่อฉันเรียกใช้บางสิ่งบางอย่างและเห็นข้อความแสดงข้อผิดพลาด "คุณลืม 'sudo', คนโง่" ฉันสามารถแทงที่ F2 ด้วยความรำคาญ
Michael Mrozek

คีย์ F2 แย่ ... .)
Eimantas

ฉันใช้สิ่งนี้ตลอดเวลา ฉันลืมพิมพ์ sudo ตลอดเวลาก่อนที่จะแก้ไขไฟล์โฮสต์ของฉัน ถ้าเป็นเช่นนั้นฉันก็จะเรียกใช้ sudo !! +1
Brian Wigginton

10

หากคำสั่งรับอินพุต stdin คุณสามารถอ่านอินพุตจากไฟล์<filenameได้ สิ่งนี้สามารถปรากฏที่ใดก็ได้ในคำสั่งดังนั้นเส้นเหล่านี้จะเท่ากัน:

cat filename
cat <filename
<filename cat

สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับ grep เนื่องจากช่วยให้คุณวางนิพจน์ที่ท้ายบรรทัดดังนั้นคุณสามารถแก้ไขคำสั่ง grep ได้อย่างรวดเร็วโดยกดปุ่มUpโดยไม่ต้องเลื่อนไปทางซ้ายเพื่อผ่านชื่อไฟล์:

<filename grep 'expression'

3
เคล็ดลับที่ดี! น่าสังเกตว่านี่ไม่ได้เรียงลำดับอาร์กิวเมนต์ไปยังคำสั่งจริง แต่จะส่งไฟล์ไปยังกระบวนการ 'STDIN แทนเนื่องจาก grep ในขณะนี้ไม่มีอาร์กิวเมนต์ไฟล์ที่เป็นค่าเริ่มต้นให้อ่านจาก STDIN การทำความเข้าใจสิ่งนี้จะเปิดโอกาสมากมายที่จะใช้เทคนิคนี้กับคำสั่งอื่น ๆ และยังช่วยให้ผู้คนเข้าใจว่าเกิดอะไรขึ้นเมื่อสิ่งต่าง ๆ ไม่ทำงานตามที่คาดไว้ สำหรับข้อมูลเพิ่มเติมค้นหาท่อและตัวเปลี่ยนเส้นทาง: dsj.net/compedge/shellbasics1.html
chillitom

@ chill คะแนนดี; เคล็ดลับจริง ๆ แล้วเป็นประโยคที่พูดได้ไม่ดี ฉันเขียนมันใหม่ตามความคิดเห็นของคุณ
Michael Mrozek

บางสิ่งที่ฉันค้นพบเมื่อเร็ว ๆ นี้: คุณสามารถเปลี่ยนทิศทางอินพุตไปเป็นลูป (สำหรับในขณะที่ ฯลฯ ) ดูfaqs.org/docs/abs/HTML/redircb.html
ลูคัสโจนส์

ตามอัตภาพคุณทำให้การเปลี่ยนเส้นทางในตอนท้าย ในขณะที่อุปมาอุปไมยไปป์ไลน์ดูดีขึ้น<input foo | bar | baz >outputแต่ก็ไม่ได้ผลถ้าคุณลองผสมในการวนรอบบางอย่างเช่นwhileหรือforตรงกลาง ดังนั้นฉันจึงเลิกและวางมันไว้ท้ายที่สุดตามแบบแผน
jmtd

@jmtd เอาไปวางไว้ที่ท้ายกำจัด "นี่เป็นประโยชน์อย่างยิ่งสำหรับ grep เพราะมันช่วยให้คุณวางนิพจน์ที่ท้ายบรรทัดดังนั้นคุณสามารถแก้ไขคำสั่ง grep ได้อย่างรวดเร็วโดยกดขึ้นโดยไม่จำเป็นต้องเลื่อน ปล่อยให้ผ่านชื่อไฟล์ "
Michael Mrozek

9

คุณสามารถใช้CDPATHเพื่อตั้งค่าไดเรกทอรีเทียบเท่าPATH; หากคุณพยายามที่จะcd fooและไม่มีfooในไดเรกทอรีปัจจุบันเปลือกจะตรวจสอบแต่ละไดเรกทอรีในการCDPATHค้นหาfooพวกเขาและสลับไปยังคนแรกที่พบ:

export CDPATH="/usr"
cd bin # switches to 'bin' if there is one in the current directory, or /usr/bin otherwise

3
นี่อาจทำให้เกิดปัญหา ดูsoftpanorama.org/Scripting/Shellorama/cdpath.shtml "ถ้าตั้งค่า $ CDPATH ซีดีในตัวจะไม่ผนวกไดเรกทอรีปัจจุบันโดยปริยายซึ่งหมายความว่า cd จะล้มเหลวหากไม่มีชื่อไดเรกทอรีที่ถูกต้องสามารถสร้างได้ ของรายการใน $ CDPATH แม้ว่าไดเรกทอรีที่มีชื่อเดียวกับชื่อที่กำหนดให้เป็นอาร์กิวเมนต์สำหรับซีดีนั้นมีอยู่ในไดเรกทอรีปัจจุบัน " ฉันถูกกัดโดยสิ่งนี้ทำให้บาง Makefile หยุดทำงาน ผนวก ชัดเจนว่าอาจช่วย แต่มีปัญหาบางอย่างกับที่เช่นกัน
ustun

9
vi `which scriptname`

เพราะเมื่อไหร่ที่คุณไม่รู้ว่ามีอะไรอยู่และคุณก็ไม่สนใจเช่นกัน


8
ฉันไม่ได้ตั้งใจจะเสียบคุณสมบัติของ ZSH แต่ฉันคิดถึงพวกเขาในขณะที่คนอื่น ๆ ตอบ :) ใน ZSH คุณสามารถทำได้ = foo เพื่อเรียกใช้whichโดยอัตโนมัติดังนั้นvi =scriptname
Michael Mrozek

หากคุณมีปัญหาในการค้นหาตัวอักษร backtick คุณสามารถใช้$(scriptname)
Patrick

9

เครื่องหมาย มันทำให้คำสั่งของคุณในพื้นหลังเพื่อให้คุณสามารถพิมพ์ต่อไป

$> sudo updatedb &

ทำงานตามและหลังจากนั้นครู่หนึ่งคุณจะเห็น:

[1] 17403

และกระบวนการของคุณเสร็จแล้ว! เหมาะอย่างยิ่งสำหรับสิ่งที่คุณไม่จำเป็นต้องรอให้ยุติ


11
และหากแอปของคุณเป็น GUI คุณอาจไม่ต้องการให้มันทำงานต่อไป ผนวก&!กับพื้นหลังของงานและไม่สนใจมันจากเปลือก!
unperson325680

@progo: bashนั่นไม่ทำงานสำหรับฉันใน
นาธานออสมัน

@George ดูเหมือนว่าคุณพูดถูก ฉันได้เรียนรู้ว่า zsh สนับสนุนและต่อมาฉันก็ได้ยินว่าทุบตีสนับสนุนมันเช่นกัน โอ้ของฉัน :(
unperson325680

1
@progo: ปรากฎว่าการเตรียมคำสั่งด้วยการnohupทำสิ่งนี้ให้สำเร็จ
นาธานออสมัน

8

เสร็จสิ้นแท็บ มันจะแย่แค่ไหนถ้าคุณต้องพิมพ์ตัวละครทุกตัวในทุกเส้นทาง?


5
มีลินุกซ์ฆ่าตัวตาย หากคุณพิมพ์คำสั่งไม่ถูกต้อง - ทำrm -fr /เช่นนั้น เพื่อใช่แท็บเสร็จสิ้นมีความสำคัญสวย ...
Eimantas

ไม่เลวเท่าที่คุณคิด (แต่ก็ยังไม่ดี) คุณเพียงแค่ใช้สัญลักษณ์เสริมในทุกที่:ls /usr/lib/game-d*/rott*
jmtd

@Eimantas ไม่ได้rm -rf /ปิดการใช้งานในระบบ Linux ส่วนใหญ่ใช่ไหม
Bernhard Heijstek

@phycker - ฉันพูดถึง Suicide Linux ไม่ใช่ "all"
Eimantas

7

จำนวนอุปกรณ์ที่เมาท์ล่าสุด:

mount /media/whatever
...
u!mo

!moขยายเป็นคำสั่งสุดท้ายที่เริ่มต้นด้วยmo(อย่างน้อยใน bash) บางครั้งมีคนmvอยู่ตรงกลางดังนั้นu!mจะไม่ได้ผลบ่อย


ใช้ Ctrl + Shift + 6 (Ctrl + ^) เพื่อขยายคำสั่งโดยไม่เรียกใช้เพื่อความปลอดภัย
ColinM

7

ฉันมีสิ่งนี้ใน. bashrc ของฉัน

#shortcut for CTRL+C and CTRL+V
alias c-c='xclip -sel clip'
alias c-v='xclip -o -sel clip'

 

function find-all() {
    python -c "import re
import sys
for i in re.findall('$1', sys.stdin.read()):
    if type(i) == type(''):
        print i
    else:
        print i[0]"
}

และเมื่อฉันมีซอร์สโค้ด HTML ในคลิปบอร์ดและต้องการค้นหาลิงก์ทั้งหมดที่ฉันใช้

c-v | find-all 'href="([^"]*)"' | c-c

และฉันมี URL ทั้งหมดในคลิปบอร์ด

ฉันยังมีฟังก์ชั่นนี้

function lsq(){
    ls -lh $@ | tr -s ' ' | cut -d' ' -f5,8
}

ขนาดการแสดงผลใด (มนุษย์สามารถอ่านได้) และชื่อไฟล์

alias temp='cat /proc/acpi/thermal_zone/THRM/temperature'

นามแฝงนี้มีไว้สำหรับแสดงอุณหภูมิ

function separate() {
    python -c "import sys,re; print '$1'.join(re.split('\s*', sys.stdin.read().strip()))";
}

ด้วยฟังก์ชั่นนี้ฉันสามารถคำนวณผลรวมสินค้าหรือผลรวมของข้อโต้แย้ง

alias sum='separate + | bc'
alias product='separate * | bc'

function split-join() {
    python -c "import sys,re; print '$2'.join(re.split('$1', sys.stdin.read().strip()))";
}

นี่คือฟังก์ชั่นที่เป็นประโยชน์ซึ่งแยกอินพุตมาตรฐานคั่นด้วย regex แล้วเข้าร่วมผลลัพธ์

function factorial() {
    seq -s* $1 | bc
}

ฟังก์ชันแฟกทอเรียล

function wiki() { dig +short txt $1.wp.dg.cx; }

ฟังก์ชั่นนี้แสดงข้อความ wiki ผ่าน DNS

ฉันมี funcions สามสีด้วย

function blue() {
    echo -e "\x1b[34m\x1b[1m"$@"\x1b[0m";
}

function green() {
    echo -e "\x1b[32m\x1b[1m"$@"\x1b[0m";
}

function red() {
    echo -e "\x1b[31m\x1b[1m"$@"\x1b[0m";
}

 

function md5check() {
    test `md5sum $2 | cut -d' ' -f1` = "$1" && green [OK] || red [FAIL]
}

ฟังก์ชันนี้ตรวจสอบความถูกต้องของไฟล์ md5 hash

นี่จะแสดงข้อความแสดงข้อผิดพลาดสำหรับรหัสที่ระบุ

function strerror() { python -c "import os; print os.strerror($1)"; }

คุณสามารถพิมพ์ข้อความทั้งหมดด้วย

alias all-errors='for i in `seq 131`; do echo -n "$i: "; strerror $i; done'

6

เคล็ดลับ ZSH ที่มีประโยชน์อื่น:

ถือว่าเอาต์พุตของคำสั่งเป็นไฟล์:

emacs =(hg cat -r 100 somefile)

นี่เป็นการเปิดไฟล์ Mercurial-track ที่เป็นเวอร์ชั่นเก่าใน emacs เพื่อการดูที่เน้นทางไวยากรณ์ โดยไม่ว่าผมจะต้องยุ่ง ๆ กับhg revert, hg archiveหรืออย่างชัดเจนส่งhg catออกไปยังแฟ้มชั่วคราว

แน่นอนว่าทำงานได้กับโปรแกรมใด ๆ ที่เปิดไฟล์และโปรแกรมใด ๆ ที่พิมพ์ไปยังเอาต์พุตมาตรฐาน


5
คุณสามารถทำได้ด้วยการทุบตีด้วย <()
ScaryAardvark

5

คุณลักษณะ ZSH เฉพาะเป็นชื่อแทนคำต่อท้ายที่กำหนดโดยให้ธง:alias-s

alias -s ext=program

หากส่วนขยายที่กำหนดมีนามแฝงต่อท้ายคุณสามารถเรียกใช้ไฟล์ที่มีส่วนขยายนั้นโดยตรงและ ZSH จะเปิดโปรแกรมที่กำหนดและส่งชื่อไฟล์เป็นอาร์กิวเมนต์ ดังนั้นหากนามแฝงข้างต้นมีผลบังคับใช้เส้นเหล่านี้จะเท่ากัน:

/path/to/foo.ext
program /path/to/foo.ext

นี่คือสิ่งหนึ่งที่ฉันคิดถึง Windows จริงๆ ... จนกว่าฉันจะรู้ว่า "โปรแกรม" นั้นเป็น emacs อยู่เสมอดังนั้นฉันจึงหยุดใช้เชลล์เพื่อเปิดไฟล์และใช้ Cx Cf (duh)
harpo

5

หนึ่งในฟีเจอร์ ZSH ที่ฉันโปรดปรานตลอดเวลาคือชื่อไดเรกทอรี คุณสามารถส่งออกตัวแปรที่มีชื่อที่กำหนดพร้อมค่าที่ชี้ไปยังเส้นทางที่แน่นอน:

export foo=/usr/bin

ตอนนี้คุณสามารถใช้~fooในคำสั่งเพื่ออ้างถึง/usr/bin:

cd ~foo
~foo/ls
cat ~foo/filename

หากพรอมต์ของคุณแสดงไดเรกทอรีการทำงานปัจจุบันชื่อของตัวแปรจะถูกใช้ที่นั่นเท่าที่ฉันจำได้
Andre Holzner

4

ดูคำถามนี้

เมื่อคุณทำงานps ax | grep string:

[steve@sage-arch ~]$ ps ax | grep 'openbox'
 3363 ?        Ss     0:00 /usr/bin/openbox
 3382 ?        Ss     0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session
 3386 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3388 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3389 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3390 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 5100 pts/0    S+     0:00 grep openbox

บรรทัดสุดท้ายที่มีgrepอยู่นั้นน่ารำคาญนิดหน่อย

คุณสามารถกำจัดสิ่งนี้ได้ด้วยการวิ่งps ax | grep '[s]tring':

[steve@sage-arch ~]$ ps ax | grep '[o]penbox'
 3363 ?        Ss     0:00 /usr/bin/openbox
 3382 ?        Ss     0:00 /usr/bin/ssh-agent -- /usr/bin/openbox-session
 3386 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3388 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3389 ?        S      0:00 /bin/sh /usr/bin/openbox-session
 3390 ?        S      0:00 /bin/sh /usr/bin/openbox-session

update : หรือเพียงแค่เรียกใช้pgrep string


ใช่มีประโยชน์มาก คุณควรอ้างอิง openbox แม้ว่า ( '[o]penbox') วงเล็บจะทำงานเหมือนกลมดังนั้นถ้ามี openbox ในไดเรกทอรีของคุณ (บอกว่าคุณอยู่/usr/bin) ทุบตีจะใช้ openbox ซึ่งจะป้องกันเคล็ดลับ grep
Rich Homolka

4
  • คำสั่ง do-nothing :ดังใน

    while :; do :; done
  • รั้งการขยายตัวร่วมกับลูป:

    for c in {1..3}; do :; done
  • !ตัวดำเนินการและตัวดำเนินการลัดวงจร||และ&&

    [ -d /tmp/dir ] || mkdir /tmp/dir
    
    if ! ping 34.41.34.1; then :; fi
  • ใช้เชลล์ย่อยแทนป๊อป / พุช (มีประโยชน์ในสคริปต์)

    ~$ ( cd /tmp; echo $PWD )
    /tmp
    ~$
  • ชนิดของคำสั่งwhat-istype

    ~$ type type
    type is a shell builtin
    ~$ type ls
    ls is aliased to `ls --color=auto'
    ~$ f(){ :; }
    ~$ type f
    f is a function
    f () 
    { 
         :
    
    }
  • ก็ดีมาก: here-strings

    ~$ cat <<<"here $PWD"
    here /home/yourname
    ~$
  • และสิ่งที่ฉันชอบ: การเปลี่ยนเส้นทางในรายการคำสั่ง

    { w; ps; ls /tmp; } 2>/dev/null |less

3

ฉันชอบที่จะทอยให้มากที่สุดเท่าที่จะทำได้ใน PS1 ของฉัน สิ่งที่มีประโยชน์ที่ควรจำ:

\e[sและ\e[uบันทึกและไม่บันทึกตำแหน่งเคอร์เซอร์ตามลำดับ ฉันใช้สิ่งนี้เพื่อสร้าง 'แถบข้อมูล' ที่ด้านบนของหน้าจอยาวสองบรรทัดซึ่งสามารถเพิ่มเติมสิ่งต่าง ๆ ได้ ตัวอย่าง:

PS1='\[\e[s\e[7m\e[1;1H\]\w\n\t        \j / \! / \#\[\e[u\e[0m\e[33;1m\][\u@\h \[\e[34m\]\W]\[\e[0m\]\$ '

alias clear='echo -e "\e[2J\n"'รวมกับ ลอง!

นอกจากนี้PROMPT_COMMANDตัวแปรจะกำหนดคำสั่งให้เรียกใช้งานก่อนหน้า PS1 ทุกครั้ง

อีกอันหนึ่งคือbgคำสั่ง หากคุณลืมใส่&ท้ายคำสั่งให้กด^Zและพิมพ์bgแล้วมันจะทำงานในพื้นหลัง


ขอบคุณสำหรับbgเมื่อฉันมีโปรแกรมที่ทำงานในพื้นหลังและกดโดยไม่ตั้งใจfgฉันไม่รู้วิธีที่จะผลักดันมันกลับมา: D
phunehehe

ผมชอบการทำความสะอาดPS1ดังนั้นฉันใส่มากที่สุดของสิ่งที่ฉันต้องการลงในบรรทัดด้านล่างหน้าจอของฉัน ...
Josh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.