The Cardinals tied this playoff matchup and improved to 7-1 over the last three years when facing elimination in the postseason.
Pedro Alvarez hit his third home run of the series, connecting with one out in the eighth for Pittsburgh's only hit in Game 4.
Wacha, who came within an out of a no-hitter in his final start of the regular season, and the St. Louis bullpen made Matt Holliday's two-run homer in the sixth stand up.
Trevor Rosenthal worked around a two-out walk in the ninth, retiring Andrew McCutchen on a popup for his first postseason save.
Game 5 will be Wednesday in St. Louis, with ace Adam Wainwright starting for the NL Central champion Cardinals and rookie Gerrit Cole going for the wild-card Pirates. Both pitchers won last week in the NLDS.
The Cardinals finished with only three hits, and that was enough. Holliday got two of them, including his homer off Charlie Morton.
Wacha struck out nine and walked two. The 22-year-old righty didn't permit a runner until walking Russell Martin leading off the sixth.
Wacha nearly no-hit the Washington Nationals in his last start on Sept. 24, surrendering only a single by Ryan Zimmerman with two outs in the ninth. He might have been even better in front of a frenzied crowd that relentlessly chanted his name, eager to send the Pirates into the NL championship series for the first time in 21 years.
Working so quickly the Pirates never had time to get settled, he breezed through Pittsburgh's revamped lineup like it he was in extended spring training, not a pressure-packed elimination game. Mixing his fastball and changeup masterfully, Wacha overwhelmed the Pirates from the moment he stepped onto the mound.
Alvarez got the fans at PNC Park roaring with his homer, and Wacha followed by walking Martin on four pitches. Carlos Martinez relieved and Gold Glove catcher Yadier Molina made a key play, throwing out pinch-runner Josh Harrison when he tried to steal second.
Link to box score: St. Louis 2 at Pittsburgh 1
Link to game discussion at The Cardinal Nation message board